SQL基礎知識V2——約束(實例)

SQL專欄數據庫

SQL數據庫基礎知識彙總ide

SQL數據庫高級知識彙總函數

NOT NULL約束設計

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

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

下面的 SQL 強制表"Customers" 的"客戶ID" 列和 "姓名" 列不接受 NULL 值:it

CREATE TABLE Customers(
 客戶ID INT NOT NULL,
 姓名 VARCHAR(10) NOT NULL,
 地址 VARCHAR(50) NULL,
 城市 VARCHAR(20) NULL,
 郵編 CHAR(6) NULL,
 省份 VARCHAR(20) NULL
) ;

一旦這兩列有空值NULL被插入,系統就會報錯提示,例如咱們插入以下信息:class

INSERT INTO dbo.Customers  ( 姓名, 地址, 城市, 郵編, 省份 )
VALUES  (NULL,'花城大道1號','廣州市','51000',NULL)

(提示:能夠左右滑動代碼)基礎

結果:語法

SQL基礎知識V2——約束(實例)

UNIQUE約束

UNIQUE 約束惟一標識數據庫表中的每條記錄。
UNIQUE 和 PRIMARY KEY 約束均爲列或列集合提供了惟一性的保證。

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

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

CREATE TABLE 時的 SQL UNIQUE 約束
下面的 SQL 在 "Orders" 表建立時在 "訂單ID" 列上建立 UNIQUE 約束:

MySQL:

CREATE TABLE dbo.Orders(
 訂單ID INT  NOT NULL,
 客戶ID INT NULL,
 員工ID INT NULL,
 訂單日期 DATETIME NULL,
 發貨ID INT NULL,
 UNIQUE (訂單ID)
) ;

SQL Server / Oracle / MS Access:

CREATE TABLE dbo.Orders(
 訂單ID INT NOT NULL UNIQUE,
 客戶ID INT NULL,
 員工ID INT NULL,
 訂單日期 DATETIME NULL,
 發貨ID INT NULL
) ;

惟一約束是被約束的列在插入新數據時,若是和已經存在的列有相同的值,則會報錯。

INSERT INTO dbo.Orders
       ( 訂單ID, 客戶ID, 員工ID, 訂單日期, 發貨ID )
VALUES  
       ( 1001,1,2,'2018-11-21 19:21:32',1),
       ( 1001,2,3,'2018-11-22 11:22:32',5)

結果:

SQL基礎知識V2——約束(實例)

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

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE dbo.Orders(
 訂單ID INT NOT NULL ,
 客戶ID INT NULL,
 員工ID INT NULL,
 訂單日期 DATETIME NULL,
 發貨ID INT NULL,
 CONSTRAINT uc_OrderID UNIQUE (訂單ID,發貨ID)
) ;

ALTER TABLE 時的 UNIQUE 約束
當表已被建立時,如需在 "訂單ID" 列建立 UNIQUE 約束,請使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Orders
ADD UNIQUE (訂單ID)

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

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Customers
ADD CONSTRAINT uc_CustomerID UNIQUE (客戶ID,姓名)

刪除UNIQUE 約束
如需刪除UNIQUE 約束,請使用下面的 SQL:

MySQL:

ALTER TABLE Orders
DROP INDEX uc_OrderID

SQL Server / Oracle / MS Access:

ALTER TABLE Customers
DROP CONSTRAINT uc_CustomerID

PRIMARY KEY約束

PRIMARY KEY 約束惟一標識數據庫表中的每條記錄。
主鍵必須包含惟一的值。

主鍵列不能包含 NULL 值。

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

CREATE TABLE 時的 PRIMARY KEY 約束
下面的 SQL 在 "Customers" 表建立時在 "客戶ID" 列上建立 PRIMARY KEY 約束:

MySQL:

CREATE TABLE dbo.Customers(
 客戶ID INT  NOT NULL,
 姓名 VARCHAR(10) NULL,
 地址 VARCHAR(50) NULL,
 城市 VARCHAR(20) NULL,
 郵編 CHAR(6) NULL,
 省份 VARCHAR(20) NULL,
 PRIMARY KEY (客戶ID)
) ;

SQL Server / Oracle / MS Access:

CREATE TABLE dbo.Customers(
 客戶ID INT  NOT NULL PRIMARY KEY,
 姓名 VARCHAR(10) NULL,
 地址 VARCHAR(50) NULL,
 城市 VARCHAR(20) NULL,
 郵編 CHAR(6) NULL,
 省份 VARCHAR(20) NULL
) ;

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

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE dbo.Customers(
 客戶ID INT  NOT NULL PRIMARY KEY,
 姓名 VARCHAR(10) NULL,
 地址 VARCHAR(50) NULL,
 城市 VARCHAR(20) NULL,
 郵編 CHAR(6) NULL,
 省份 VARCHAR(20) NULL,
 CONSTRAINT pk_CustomerID PRIMARY KEY (客戶ID,姓名)
) ;

註釋:在上面的實例中,只有一個主鍵 PRIMARY KEY(pk_CustomerID)。然而,pk_CustomerID 的值是由兩個列(客戶ID和姓名)組成的。

ALTER TABLE 時的 PRIMARY KEY 約束
當表已被建立時,如需在 "客戶ID" 列建立 PRIMARY KEY 約束,請使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Customers
ADD PRIMARY KEY (客戶ID)

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

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Customers
ADD CONSTRAINT pk_CustomerID PRIMARY KEY (客戶ID,姓名)

註釋:若是您使用 ALTER TABLE 語句添加主鍵,必須把主鍵列聲明爲不包含 NULL 值(在表首次建立時)。

刪除 PRIMARY KEY 約束
如需刪除 PRIMARY KEY 約束,請使用下面的 SQL:

MySQL:

ALTER TABLE Customers
DROP PRIMARY KEY

SQL Server / Oracle / MS Access:

ALTER TABLE Customers
DROP CONSTRAINT pk_CustomerID

FOREIGN KEY約束

一個表中的 FOREIGN KEY 指向另外一個表中的 PRIMARY KEY。
讓咱們經過一個實例來解釋外鍵。請看下面兩個表:

"Customers" 表:

SQL基礎知識V2——約束(實例)
"Orders" 表:

SQL基礎知識V2——約束(實例)

請注意,"Orders" 表中的 "客戶ID" 列指向 "Customers" 表中的 "客戶ID" 列。

"Customers" 表中的 "客戶ID" 列是 "Customers" 表中的 PRIMARY KEY。

"Orders" 表中的 "客戶ID" 列是 "Orders" 表中的 FOREIGN KEY。

FOREIGN KEY 約束用於預防破壞表之間鏈接的行爲。

FOREIGN KEY 約束也能防止非法數據插入外鍵列,由於它必須是它指向的那個表中的值之一。

CREATE TABLE 時的FOREIGN KEY 約束
下面的 SQL 在 "Orders" 表建立時在 "客戶ID" 列上建立 FOREIGN KEY 約束:

MySQL:

CREATE TABLE Orders
(
 訂單ID INT  NOT NULL,
 客戶ID INT NULL,
 員工ID INT NULL,
 訂單日期 DATETIME NULL,
 發貨ID INT NULL,
 PRIMARY KEY (訂單ID),
 FOREIGN KEY (客戶ID) REFERENCES Customers(客戶ID)
)

SQL Server / Oracle / MS Access:

CREATE TABLE Orders
(
 訂單ID INT  NOT NULL PRIMARY KEY,
 客戶ID INT NULL,
 員工ID INT NULL,
 訂單日期 DATETIME NULL,
 發貨ID INT NULL,
 FOREIGN KEY (客戶ID) REFERENCES Customers(客戶ID)
)

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

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Orders
(
 訂單ID INT  NOT NULL,
 客戶ID INT NULL,
 員工ID INT NULL,
 訂單日期 DATETIME NULL,
 發貨ID INT NULL,
 PRIMARY KEY (訂單ID),
 CONSTRAINT fk_CusOrders FOREIGN KEY (客戶ID)
 REFERENCES Customers(客戶ID)
)

ALTER TABLE 時的FOREIGN KEY 約束
當 "Orders" 表已被建立時,如需在 "客戶ID" 列建立 FOREIGN KEY 約束,請使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Orders
ADD FOREIGN KEY (客戶ID)
REFERENCES Customers(客戶ID)

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

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Orders
ADD CONSTRAINT fk_CusOrders
FOREIGN KEY (客戶ID)
REFERENCES Persons(客戶ID)

刪除 FOREIGN KEY 約束
如需刪除FOREIGN KEY 約束,請使用下面的 SQL:

MySQL:

ALTER TABLE Orders
DROP FOREIGN KEY fk_CusOrders

SQL Server / Oracle / MS Access:

ALTER TABLE Orders
DROP CONSTRAINT fk_CusOrders

DEFAULT約束

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

若是沒有規定其餘的值,那麼會將默認值添加到全部的新記錄。

CREATE TABLE 時的DEFAULT 約束
下面的 SQL 在 "Customers" 表建立時在 "城市" 列上建立 DEFAULT 約束:

My SQL / SQL Server / Oracle / MS Access:

CREATE TABLE dbo.Customers(
 客戶ID INT  NOT NULL,
 姓名 VARCHAR(10) NULL,
 地址 VARCHAR(50) NULL,
 城市 VARCHAR(20) NULL DEFAULT '北京市',
 郵編 CHAR(6) NULL,
 省份 VARCHAR(20) NULL
) ;

SQL Server中經過使用相似 GETDATE() 這樣的函數,DEFAULT 約束也能夠用於插入系統值:

CREATE TABLE dbo.Orders(
 訂單ID INT  NOT NULL,
 客戶ID INT NULL,
 員工ID INT NULL,
 訂單日期 DATETIME NULL DEFAULT GETDATE(),
 發貨ID INT NULL
) ;

ALTER TABLE 時的DEFAULT 約束
當表已被建立時,如需在 "城市" 列建立 DEFAULT 約束,請使用下面的 SQL:

MySQL:

ALTER TABLE Customers
ALTER 城市 SET DEFAULT '北京市'

SQL Server / MS Access:

ALTER TABLE Customers
ADD CONSTRAINT DF_Customers DEFAULT('北京市') FOR 城市
--註釋
--Customers爲表名
--城市 爲列名
--DF_Customers 爲咱們建立的默認約束的名稱 約束名稱通常爲:約束類型簡稱_表名

Oracle:

ALTER TABLE Customers
MODIFY 城市 DEFAULT '北京市'

刪除DEFAULT 約束
如需刪除DEFAULT 約束,請使用下面的 SQL:

MySQL:

ALTER TABLE Customers
ALTER 城市 DROP DEFAULT
SQL Server / Oracle / MS Access:

ALTER TABLE Customers
ALTER COLUMN 城市 DROP DEFAULT

CHECK約束

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

若是對單個列定義 CHECK 約束,那麼該列只容許特定的值。

若是對一個表定義 CHECK 約束,那麼此約束會基於行中其餘列的值在特定的列中對值進行限制。

CREATE TABLE 時的CHECK 約束
下面的 SQL 在 "Customers" 表建立時在 "客戶ID" 列上建立 CHECK 約束。CHECK 約束規定 "客戶ID" 列必須只包含大於 0 的整數。

MySQL:

CREATE TABLE dbo.Customers(
 客戶ID INT  NOT NULL,
 姓名 VARCHAR(10) NULL,
 地址 VARCHAR(50) NULL,
 城市 VARCHAR(20) NULL,
 郵編 CHAR(6) NULL,
 省份 VARCHAR(20) NULL,
 CHECK (客戶ID>0)
) ;

SQL Server / Oracle / MS Access:

CREATE TABLE dbo.Customers(
 客戶ID INT  NOT NULL CHECK (客戶ID>0),
 姓名 VARCHAR(10) NULL,
 地址 VARCHAR(50) NULL,
 城市 VARCHAR(20) NULL,
 郵編 CHAR(6) NULL,
 省份 VARCHAR(20) NULL
) ;

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

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE dbo.Customers(
 客戶ID INT  NOT NULL,
 姓名 VARCHAR(10) NULL,
 地址 VARCHAR(50) NULL,
 城市 VARCHAR(20) NULL,
 郵編 CHAR(6) NULL,
 省份 VARCHAR(20) NULL,
 CONSTRAINT chk_Customers CHECK (客戶ID>0 AND 城市='北京市')
) ;


ALTER TABLE 時的CHECK 約束

當表已被建立時,如需在 "客戶ID" 列建立 CHECK 約束,請使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Customers
ADD CHECK (客戶ID>0)

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

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Customers
ADD CONSTRAINT chk_Customers CHECK (客戶ID>0 AND 城市='北京市')

刪除CHECK 約束
如需CHECK 約束,請使用下面的 SQL:

SQL Server / Oracle / MS Access:

ALTER TABLE Customers
DROP CONSTRAINT chk_Customers

MySQL:

ALTER TABLE Customers
DROP CHECK chk_Customers

批註

以上六種約束是工做中常常使用到的,主要仍是用來規範數據,隨着數據量的增多,若是不對錶結構加以約束,那麼會有愈來愈多的「髒數據」進入到數據庫,這對業務系統來講是很是不肯意碰到的。因此爲了可以高效的使用數據庫,請從表結構的設計上下更多的功夫。

相關文章
相關標籤/搜索