在本教程中,您將學(xué)習(xí)如何使用SQL約束。
約束只是對(duì)表的一個(gè)或多個(gè)列的限制,以限制可以存儲(chǔ)在該列中的值的類(lèi)型。約束提供了一種標(biāo)準(zhǔn)機(jī)制來(lái)維護(hù)數(shù)據(jù)庫(kù)表內(nèi)數(shù)據(jù)的準(zhǔn)確性和完整性。
SQL中有幾種不同類(lèi)型的約束,包括:
現(xiàn)在,讓我們?cè)敿?xì)討論每個(gè)約束。
該NOT NULL限制指定列不接受NULL值。
這意味著,如果NOT NULL對(duì)列施加約束,那么您必須在表中插入新行而不為該列添加非NULL值。
以下SQL語(yǔ)句創(chuàng)建一個(gè)名為person的表,該表有四列,其中三列id,name和phone不接受NULL值。
CREATE TABLE persons ( id INT NOT NULL, name VARCHAR(30) NOT NULL, birth_date DATE, phone VARCHAR(15) NOT NULL );
注意:空值或NULL不同于零,空白或長(zhǎng)度為零的字符串,例如''。NULL表示尚未輸入。
PRIMARY KEY約束標(biāo)識(shí)具有唯一標(biāo)識(shí)表中的行值的列的列或集。表中的任何兩行都不能具有相同的主鍵值。同樣,您不能NULL在主鍵列中輸入值。
以下SQL語(yǔ)句創(chuàng)建一個(gè)名為persons的表,并將id列指定為主鍵。這意味著該字段不允許NULL或重復(fù)值。
CREATE TABLE persons ( id INT NOT NULL PRIMARY KEY, name VARCHAR(30) NOT NULL, birth_date DATE, phone VARCHAR(15) NOT NULL );
提示:主鍵通常由一個(gè)表中的一列組成,但是可以由多個(gè)列組成該主鍵,例如,員工的電子郵件地址或分配的標(biāo)識(shí)號(hào)是員工表的邏輯主鍵。
UNIQUE約束限制一個(gè)或多個(gè)列在表中包含唯一值。
盡管UNIQUE約束和PRIMARY KEY約束都強(qiáng)制唯一性,UNIQUE但是PRIMARY KEY當(dāng)您要強(qiáng)制列或列組合(而不是主鍵)的唯一性時(shí),請(qǐng)使用約束而不是約束。
以下SQL語(yǔ)句創(chuàng)建一個(gè)名為persons的表,并將phone列指定為unique。這意味著該字段不允許重復(fù)值。
CREATE TABLE persons ( id INT NOT NULL PRIMARY KEY, name VARCHAR(30) NOT NULL, birth_date DATE, phone VARCHAR(15) NOT NULL UNIQUE );
注意:可以在一個(gè)表上定義多個(gè)UNIQUE約束,而在一個(gè)表上只能定義一個(gè)PRIMARY KEY約束。而且,與PRIMARY KEY約束不同,UNIQUE約束允許NULL值。
DEFAULT約束指定列的默認(rèn)值。
列的默認(rèn)值是當(dāng)INSERT語(yǔ)句未顯式分配特定值時(shí),數(shù)據(jù)庫(kù)引擎將在列中插入的某個(gè)值。
以下SQL語(yǔ)句為“ 國(guó)家/地區(qū)”列創(chuàng)建一個(gè)默認(rèn)值。
CREATE TABLE persons ( id INT NOT NULL PRIMARY KEY, name VARCHAR(30) NOT NULL, birth_date DATE, phone VARCHAR(15) NOT NULL UNIQUE, country VARCHAR(30) NOT NULL DEFAULT 'Australia' );
注意:如果將表列定義為NOT NULL,但為該列分配一個(gè)默認(rèn)值,則在INSERT語(yǔ)句中無(wú)需為該列顯式分配一個(gè)值即可在表中插入新行。
外鍵(FK)是一列或列的組合,用于在兩個(gè)表中的數(shù)據(jù)之間建立和加強(qiáng)關(guān)系。
這是顯示雇員(employees)和部門(mén)(departments)表之間關(guān)系的示例圖。如果仔細(xì)查看,您會(huì)注意到employees表的dept_id列與departments表的主鍵列匹配。因此,dept_id為的列名員工表的外鍵的部門(mén)表。
在MySQL中,您可以如下創(chuàng)建FOREIGN KEY表時(shí)通過(guò)定義約束來(lái)創(chuàng)建外鍵。以下語(yǔ)句在employees表的dept_id列上建立一個(gè)外鍵,該外鍵引用departments表的dept_id列。
CREATE TABLE employees ( emp_id INT NOT NULL PRIMARY KEY, emp_name VARCHAR(55) NOT NULL, hire_date DATE NOT NULL, salary INT, dept_id INT, FOREIGN KEY (dept_id) REFERENCES departments(dept_id) );
CHECK約束用于限制可以放置在列中的值。
例如,可以通過(guò)創(chuàng)建一個(gè)CHECK約束來(lái)限制薪水列的值范圍,該約束只允許值在3,000到10,000之間。這樣可以防止輸入超出正常工資范圍的工資。這是一個(gè)實(shí)例:
CREATE TABLE employees ( emp_id INT NOT NULL PRIMARY KEY, emp_name VARCHAR(55) NOT NULL, hire_date DATE NOT NULL, salary INT NOT NULL CHECK (salary >= 3000 AND salary <= 10000), dept_id INT, FOREIGN KEY (dept_id) REFERENCES departments(dept_id) );
注意: MySQL不支持SQL檢查約束。 雖然,MySQL的所有存儲(chǔ)引擎都會(huì)解析CHECK子句,但會(huì)將其忽略。