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)
(提示:能夠左右滑動代碼)基礎
結果:語法
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)
結果:
如需命名 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" 表:
"Orders" 表:
請注意,"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
批註
以上六種約束是工做中常常使用到的,主要仍是用來規範數據,隨着數據量的增多,若是不對錶結構加以約束,那麼會有愈來愈多的「髒數據」進入到數據庫,這對業務系統來講是很是不肯意碰到的。因此爲了可以高效的使用數據庫,請從表結構的設計上下更多的功夫。