在本教程中,您將學(xué)習(xí)如何使用SQL約束。
約束只是對表的一個或多個列的限制,以限制可以存儲在該列中的值的類型。約束提供了一種標(biāo)準(zhǔn)機制來維護數(shù)據(jù)庫表內(nèi)數(shù)據(jù)的準(zhǔn)確性和完整性。
SQL中有幾種不同類型的約束,包括:
現(xiàn)在,讓我們詳細討論每個約束。
該NOT NULL限制指定列不接受NULL值。
這意味著,如果NOT NULL對列施加約束,那么您必須在表中插入新行而不為該列添加非NULL值。
以下SQL語句創(chuàng)建一個名為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不同于零,空白或長度為零的字符串,例如''。NULL表示尚未輸入。
PRIMARY KEY約束標(biāo)識具有唯一標(biāo)識表中的行值的列的列或集。表中的任何兩行都不能具有相同的主鍵值。同樣,您不能NULL在主鍵列中輸入值。
以下SQL語句創(chuàng)建一個名為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 );
提示:主鍵通常由一個表中的一列組成,但是可以由多個列組成該主鍵,例如,員工的電子郵件地址或分配的標(biāo)識號是員工表的邏輯主鍵。
UNIQUE約束限制一個或多個列在表中包含唯一值。
盡管UNIQUE約束和PRIMARY KEY約束都強制唯一性,UNIQUE但是PRIMARY KEY當(dāng)您要強制列或列組合(而不是主鍵)的唯一性時,請使用約束而不是約束。
以下SQL語句創(chuàng)建一個名為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 );
注意:可以在一個表上定義多個UNIQUE約束,而在一個表上只能定義一個PRIMARY KEY約束。而且,與PRIMARY KEY約束不同,UNIQUE約束允許NULL值。
DEFAULT約束指定列的默認值。
列的默認值是當(dāng)INSERT語句未顯式分配特定值時,數(shù)據(jù)庫引擎將在列中插入的某個值。
以下SQL語句為“ 國家/地區(qū)”列創(chuàng)建一個默認值。
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,但為該列分配一個默認值,則在INSERT語句中無需為該列顯式分配一個值即可在表中插入新行。
外鍵(FK)是一列或列的組合,用于在兩個表中的數(shù)據(jù)之間建立和加強關(guān)系。
這是顯示雇員(employees)和部門(departments)表之間關(guān)系的示例圖。如果仔細查看,您會注意到employees表的dept_id列與departments表的主鍵列匹配。因此,dept_id為的列名員工表的外鍵的部門表。
在MySQL中,您可以如下創(chuàng)建FOREIGN KEY表時通過定義約束來創(chuàng)建外鍵。以下語句在employees表的dept_id列上建立一個外鍵,該外鍵引用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約束用于限制可以放置在列中的值。
例如,可以通過創(chuàng)建一個CHECK約束來限制薪水列的值范圍,該約束只允許值在3,000到10,000之間。這樣可以防止輸入超出正常工資范圍的工資。這是一個實例:
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的所有存儲引擎都會解析CHECK子句,但會將其忽略。