SQL 高級教程之約束 2015/5/8/星期五 9:21:40
我們將主要探討以下幾種約束:
- NOT NULL
- UNIQUE
- PRIMARY KEY
- FOREIGN KEY
- CHECK
- DEFAULT
- 如果Key是空的,那么該列值的可以重復,表示該列沒有索引,或者是一個非唯一的復合索引的非前導列;
- 如果Key是PRI,那么該列是主鍵的組成部分;
- 如果Key是UNI,那么該列是一個唯一值索引的第一列(前導列),並別不能含有空值(NULL);
- 如果Key是MUL,那么該列的值可以重復,該列是一個非唯一索引的前導列(第一列)或者是一個唯一性索引的組成部分但是可以含有空值NULL。
如果對於一個列的定義,同時滿足上述4種情況的多種, 比如一個列既是PRI,又是UNI,那么"desc 表名"的時候,顯示的Key值按照優先級來顯示 PRI->UNI->MUL。那么此時,顯示PRI。
一個唯一性索引列可以顯示為PRI,並且該列不能含有空值,同時該表沒有主鍵。
一個唯一性索引列可以顯示為MUL,如果多列構成了一個唯一性復合索引,因為雖然索引的多列組合是唯一的,比如ID+NAME是唯一的,但是沒一個單獨的列依然可以有重復的值,只要ID+NAME是唯一的即可。
設置復合主鍵的原因是當一個列不足以用來表示一條記錄的唯一性的時候,就需要設置多個列為復合主鍵,來標識一條記錄的唯一性。
1、NOT NULL
SQL NOT NULL 約束
NOT NULL 約束強制列不接受 NULL 值。
NOT NULL 約束強制字段始終包含值。這意味着,如果不向字段添加值,就無法插入新記錄或者更新記錄。
下面的 SQL 語句強制 "Id_P" 列和 "LastName" 列不接受 NULL 值:
CREATE TABLE Persons ( Id_P intNOT 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:
上面標紅的 先寫后寫無所謂。

撤銷 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 約束
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


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