SQL 約束(Constraints)

在本教程中,您將學(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約束

該NOT NULL限制指定列不接受NULL值。

這意味著,如果NOT NULL對(duì)列施加約束,那么您必須在表中插入新行而不為該列添加非NULL值。

以下SQL語(yǔ)句創(chuàng)建一個(gè)名為person的表,該表有四列,其中三列idnamephone不接受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)

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)

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值。

默認(rèn)約束(DEFAULT)

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è)值即可在表中插入新行。

外鍵約束(FOREIGN KEY)

外鍵(FK)是一列或列的組合,用于在兩個(gè)表中的數(shù)據(jù)之間建立和加強(qiáng)關(guān)系。

這是顯示雇員(employees)部門(mén)departments)表之間關(guān)系的示例圖。如果仔細(xì)查看,您會(huì)注意到employees表的dept_id列與departments表的主鍵列匹配。因此,dept_id為的列名員工表的外鍵的部門(mén)表。

外鍵關(guā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)

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ì)將其忽略。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清