SQL 高級教程之約束


SQL 高級教程之約束 2015/5/8/星期五 9:21:40

我們將主要探討以下幾種約束:

  • NOT NULL
  • UNIQUE
  • PRIMARY KEY
  • FOREIGN KEY
  • CHECK
  • DEFAULT
補充知識:
使用MySQL數據庫desc 表名時,我們看到Key那一欄,可能會有4種值,即 ' ','PRI','UNI','MUL'。
  1. 如果Key是空的,那么該列值的可以重復,表示該列沒有索引,或者是一個非唯一的復合索引的非前導列;
  2. 如果Key是PRI,那么該列是主鍵的組成部分;
  3. 如果Key是UNI,那么該列是一個唯一值索引的第一列(前導列),並別不能含有空值(NULL);
  4. 如果Key是MUL,那么該列的值可以重復,該列是一個非唯一索引的前導列(第一列)或者是一個唯一性索引的組成部分但是可以含有空值NULL。

如果對於一個列的定義,同時滿足上述4種情況的多種, 比如一個列既是PRI,又是UNI,那么"desc 表名"的時候,顯示的Key值按照優先級來顯示 PRI->UNI->MUL。那么此時,顯示PRI。
一個唯一性索引列可以顯示為PRI,並且該列不能含有空值,同時該表沒有主鍵。
一個唯一性索引列可以顯示為MUL,如果多列構成了一個唯一性復合索引,因為雖然索引的多列組合是唯一的,比如ID+NAME是唯一的,但是沒一個單獨的列依然可以有重復的值,只要ID+NAME是唯一的即可。

 

PRIMARY KEY 約束可以是由多列組合(復合組鍵)定義的,
某一列的值可以重復,
但PRIMARY KEY 約束定義中所有列的組合值必須唯一。
設置復合主鍵的原因是當一個列不足以用來表示一條記錄的唯一性的時候,就需要設置多個列為復合主鍵,來標識一條記錄的唯一性。

1、NOT NULL

SQL NOT NULL 約束

NOT NULL 約束強制列不接受 NULL 值。

NOT NULL 約束強制字段始終包含值。這意味着,如果不向字段添加值,就無法插入新記錄或者更新記錄。

下面的 SQL 語句強制 "Id_P" 列和 "LastName" 列不接受 NULL 值:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
 

2、UNIQUE 約束

SQL UNIQUE 約束

UNIQUE 約束唯一標識數據庫表中的每條記錄。

UNIQUE 和 PRIMARY KEY 約束均為列或列集合提供了唯一性的保證。

PRIMARY KEY 擁有自動定義的 UNIQUE 約束。

請注意,每個表可以有多個 UNIQUE 約束,但是每個表只能有一個 PRIMARY KEY 約束。

 

UNIQUE KEY的用途:主要是用來防止數據插入的時候重復的。 

 

SQL UNIQUE Constraint on CREATE TABLE

下面的 SQL 在 "SP" 表創建時在 "SID" 列創建 UNIQUE 約束:


MySQL:

mysql> CREATE TABLE SP -> ( -> SID int NO NULL, -> SNAME varchar(50) NOT NULL, -> Pro_add varchar(50), -> Pro_time datetime, -> UNIQUE (SID) -> );

SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

如果需要命名 UNIQUE 約束,以及為多個列定義 UNIQUE 約束,請使用下面的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
)
若同時創建。Key 那一列顯示為PRI。若分開添加,這第一個添加的為PRI。第二個為UNI。
 
          
 
         

SQL UNIQUE Constraint on ALTER TABLE

當表已被創建時,如需在 "Id_P" 列創建 UNIQUE 約束,請使用下列 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD UNIQUE (Id_P)

如需命名 UNIQUE 約束,並定義多個列的 UNIQUE 約束,請使用下面的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)

撤銷 UNIQUE 約束

如需撤銷 UNIQUE 約束,請使用下面的 SQL:

MySQL:

ALTER TABLE Persons
DROP INDEX uc_PersonID

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID

3、SQL PRIMARY KEY 約束

PRIMARY KEY 約束唯一標識數據庫表中的每條記錄。

主鍵必須包含唯一的值。

主鍵列不能包含 NULL 值。

每個表都應該有一個主鍵,並且每個表只能有一個主鍵。

MySQL:

mysql> create table SP (SID int not null,SNAME varchar(50),Pro_add varchar(50),Pro_time datetime,primary key (SID));
或者
mysql> create table SP (SID int primary key not null,SNAME varchar(50),Pro_add varchar(50),Pro_time datetime); 

上面標紅的 先寫后寫無所謂。


 
多列組合主鍵     復合組鍵

 
 

撤銷 PRIMARY KEY 約束

如需撤銷 PRIMARY KEY 約束,請使用下面的 SQL:

MySQL:

ALTER TABLE Persons
DROP PRIMARY KEY

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
 

 

SQL FOREIGN KEY 約束

 
 
一個表中的 FOREIGN KEY 指向另一個表中的 PRIMARY KEY
 
 

SQL CHECK 約束

SQL CHECK 約束

CHECK 約束用於限制列中的值的范圍。

如果對單個列定義 CHECK 約束,那么該列只允許特定的值。

如果對一個表定義 CHECK 約束,那么此約束會在特定的列中對值進行限制。

 

SQL CHECK Constraint on CREATE TABLE

下面的 SQL 在 "Persons" 表創建時為 "Id_P" 列創建 CHECK 約束。CHECK 約束規定 "Id_P" 列必須只包含大於 0 的整數。

My SQL:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)

SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL CHECK (Id_P>0), 此方法在mysql中也可以使用。 LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) ) 

如果需要命名 CHECK 約束,以及為多個列定義 CHECK 約束,請使用下面的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
)

SQL CHECK Constraint on ALTER TABLE

如果在表已存在的情況下為 "Id_P" 列創建 CHECK 約束,請使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CHECK (Id_P>0)

如果需要命名 CHECK 約束,以及為多個列定義 CHECK 約束,請使用下面的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')

撤銷 CHECK 約束

如需撤銷 CHECK 約束,請使用下面的 SQL:

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP CONSTRAINT chk_Person

MySQL:

ALTER TABLE Persons
DROP CHECK chk_Person

check約束 是規定表中的某一列必須符合某種條件。比如大於0小於0.或者其他。
在mysql中。check形同虛設。

 
 
仍然可以插入。尼瑪  mysql 還是不行啊 
 

SQL DEFAULT 約束

DEFAULT 約束用於向列中插入默認值。

如果沒有規定其他的值,那么會將默認值添加到所有的新記錄。

mysql> CREATE TABLE Persons (

 Id_P int NOT NULL, 

LastName varchar(255) NOT NULL, 

FirstName varchar(255), 

Address varchar(255), 

City varchar(255) DEFAULT 'Sandnes' 

);

Query OK, 0 rows affected (0.04 sec)

 

mysql> insert into Persons(Id_P,LastName,FirstName,Address) values(1,'hongtao','sun','beijing');

Query OK, 1 row affected (0.00 sec)

插入數據時,沒有指定City。結果中已經default 填充進去了。


插入的時候。必須要聲明 屬性。

否則報錯。
 

SQL DEFAULT Constraint on ALTER TABLE

如果在表已存在的情況下為 "City" 列創建 DEFAULT 約束,請使用下面的 SQL:

MySQL:

ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES'

 

撤銷 DEFAULT 約束

如需撤銷 DEFAULT 約束,請使用下面的 SQL:

MySQL:

ALTER TABLE Persons
ALTER City DROP DEFAULT

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM