SQL約束
1. 約束的概念
- 約束是對表中的字段通過添加約束條件,來保證數據的正確和可靠性。
2. 常見的約束
- NOT NULL
- UNIQUE
- PRIMARY KEY
- FOREIGN KEY
- CHECK
- DEFAULT
3.UNIQUE 唯一約束
1.特點
- 不允許用重復數據出現
- 允許為null ,但不允許有多個null,只能有一個,null也是不許重復的
- 每個表可以有多個字段設置 UNIQUE約束。
2.添加 UNIQUE 約束
1.創建表時添加
下面的 SQL 在 "Persons" 表創建時在 "Id_P" 列創建 UNIQUE 約束:
MySQL:
CREATE TABLE Persons(
Id_P int NOT NULL,
LastName varchar(50) NOT NULL,
FirstName varchar(50),
Address varchar(50),
City varchar(50),
UNIQUE (Id_P) -- 采用的表級約束,對Id_P 字段添加的唯一約束, ()里面可以有多個字段,但每個字段長度不能超過767字節。
)
CREATE TABLE Persons(
Id_P int NOT NULL UNIQUE , -- 采用的列級約束,對Id_P 字段添加的唯一約束,長度不能超過767字節。
LastName varchar(50) NOT NULL,
FirstName varchar(50),
Address varchar(50),
City varchar(50),
)
SQL Server / Oracle / MS Access:
CREATE TABLE Persons(
Id_P int NOT NULL UNIQUE, -- 采用的列級約束,對Id_P 字段添加的唯一約束,長度不能超過767字節。
LastName varchar(50) NOT NULL,
FirstName varchar(50),
Address varchar(50),
City varchar(50)
)
2.表已存在時添加
當表已被創建時,如需在 "Id_P" 列創建 UNIQUE 約束,請使用下列 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD UNIQUE (Id_P); -- 通過修改表結構的方式,來添加表級字段約束
ALTER TABLE Persons
MODIFY COLUMN Id_P INT UNIQUE ; -- 通過修改表結構的方式,來添加列級字段約束
3. 重命名 UNIQUE約束
1.創建表時重命名
在創建表的時候默認的時候約束名字就叫UNIQUE,如果我們想更改約束名字請使用下面的 SQL 語法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons(
Id_P int NOT NULL,
LastName varchar(50) NOT NULL,
FirstName varchar(50),
Address varchar(50),
City varchar(50),
CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName) -- UNIQUE 默認用()中第一個字段名命名。 uc_PersonID 是別名。
);
2.表已存在時重命名
當表已被創建時,如需命名 UNIQUE 約束,並定義多個列的 UNIQUE 約束,請使用下面的 SQL 語法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP INDEX uc_PersonID, --- 先刪除 UNIQUE約束 的索引
ADD CONSTRAINT PersonID UNIQUE (Id_P,LastName); --- 在重新創建 UNIQUE約束
4. 刪除UNIQUE約束
MySQL:
ALTER TABLE Persons
DROP INDEX uc_PersonID -- 這里只能通過DROP來刪除約束,不能通過修改表的字段結構的方式去修改
SQL Server / Oracle / MS Access::
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID -- 這里只能通過DROP來刪除約束,不能通過修改表結構的方式去修改
4. NOT NULL 非空約束
1.特點
- 強制字段不接受 NULL 值。
- NOT NULL 約束強制字段始終包含值。這意味着,如果不向字段添加值,就無法插入新記錄或者更新記錄。
- 一個表中允許 多個字段設置 NOT NULL非空約束
2.添加 NOT NULL約束
1.創建表時添加
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons(
Id_P int NOT NULL, -- 采用的列級約束,對字段添加 非空約束
LastName varchar(50) NOT NULL, -- 采用的列級約束,對字段添加 非空約束
FirstName varchar(50),
Address varchar(50),
City varchar(50)
);
2.表已存在時添加
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
MODIFY COLUMN LastName VARCHAR (20) NOT NULL ; -- 通過修改字段的方式,來修改字段約束,添加上NOT NULL。
3.刪除,修改 NOT NULL約束
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
MODIFY COLUMN LastName VARCHAR (20) NULL ; --通過修改字段的方式,來修改字段約束,把NOT NULL修改成NULL,或直接刪除不寫約束來刪除非空約束
5. PRIMARY KEY 主鍵約束
1.特點
- PRIMARY KEY 約束唯一標識數據庫表中的每條記錄。
- 主鍵必須包含唯一的值。
- 主鍵列不能包含 NULL 值。
- 每個表都應該有一個主鍵,並且每個表只能有一個主鍵。
- 不能給多個字段設置多個主鍵, 一個主鍵可以保函多個字段。
2. 添加 PRIMARY KEY 主鍵約束
1.創建表時添加
下面的 SQL 在 "Persons" 表創建時在 "Id_P" 列創建 PRIMARY KEY 約束:
MySQL /SQL Server / Oracle / MS Access:
CREATE TABLE Persons(
Id_P int NOT NULL PRIMARY KEY, -- 采用的列級約束,對Id_P 字段添加的主鍵約束。
LastName varchar(50) NOT NULL, --- 表只能有一個主鍵,但是可以保函多個字段,但不是每個字段都可以設置一個主鍵
FirstName varchar(50),
Address varchar(50),
City varchar(50)
);
CREATE TABLE Persons(
Id_P int NOT NULL,
LastName varchar(50) NOT NULL,
FirstName varchar(50),
Address varchar(50),
City varchar(50),
PRIMARY KEY (Id_P,LastName) -- 采用的表級約束,對Id_P 字段添加的主鍵約束,() 里可以添加多個字段,以多個字段的值為標准作為主鍵約束條件
--- 表只能有一個主鍵,但是可以保函多個字段,但不是每個字段都可以設置一個主鍵
);
2.表已存在時 添加 PRIMARY KEY
MySQL /SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD PRIMARY KEY (Id_P)
3. 重命名 PRIMARY KEY約束名
1.創建表時重命名
在創建表的時候默認的時候約束名字就叫PRIMARY,如果我們想更改約束名字請使用下面的 SQL 語法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons(
Id_P int NOT NULL,
LastName varchar(50) NOT NULL,
FirstName varchar(50),
Address varchar(50),
City varchar(50),
CONSTRAINT uc_PersonID PRIMARY KEY(Id_P,LastName) -- PRIMARY KEY默認用PRIMARY作為主鍵的約束名。 uc_PersonID 是別名。
);
2.表已存在時重命名
當表已被創建時,如需命名 PRIMARY KEY約束名,並定義多個列的 PRIMARY KEY約束,請使用下面的 SQL 語法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP INDEX uc_PersonID, --- 先刪除 PRIMARY KEY約束名
ADD CONSTRAINT PersonID PRIMARY KEY(Id_P,LastName); --- 在重新創建 PRIMARY KEY約束名
4. 刪除PRIMARY KEY主鍵約束
MySQL:
ALTER TABLE Persons
DROP PRIMARY KEY -- 這里只能通過DROP來刪除約束,不能通過修改表的字段結構的方式去修改
SQL Server / Oracle / MS Access::
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID -- 這里只能通過DROP來刪除約束,不能通過修改表結構的方式去修改
-- 通過約束名字刪除約束
6. FOREIGN KEY 外鍵約束
1.特點
- 一個表中的 FOREIGN KEY 指向另一個表中的 PRIMARY KEY,保證兩個字段的一致性。
- FOREIGN KEY 約束用於預防破壞表之間連接的動作
- FOREIGN KEY 約束也能防止非法數據插入外鍵列,因為它必須是它指向的那個表中的值之一。
2.添加FOREIGN KEY 外鍵約束
1.創建表添加
我們知道FOREIGN KEY約束是需要關聯另一張表的主鍵的,所以我們創建一個departments 部門表,然后用employees 員工表去管理部門表。SQL如下:
departments 表:
CREATE TABLE departments(
department_id INT PRIMARY KEY, -- 這里設置為主鍵
department_name VARCHAR(50) NOT NULL
)
employees 表:
CREATE TABLE employees(
employee_id INT PRIMARY KEY,
employee_name VARCHAR(50) NOT NULL,
`email` VARCHAR(25),
department_id INT(3) ZEROFILL NOT NULL, -- 這個字段的數據類型,必須與 departments表的department_id字段 的數據類型一致
FOREIGN KEY (department_id) REFERENCES departments(department_id)
-- 用employees表的department_id 去引用 departments表的department_id字段 做外鍵關聯。
)
2.表已存在時添加
departments 表:
| employee_id | employee_name |
|---|---|
| 001 | 人事部 |
| 002 | 財務部 |
| 003 | 銷售部 |
employees 表:
| employee_id | employee_name | department_id | |
|---|---|---|---|
| 1 | 張飛 | 12222@163.com | 001 |
| 2 | 關羽 | 12222@163.com | 002 |
| 3 | 趙雲 | 12222@163.com | 003 |
ALTER TABLE employees
ADD FOREIGN KEY (department_id) REFERENCES departments(department_id) -- 采用給表添加表記約束的方法,添加外鍵
3.重命名FOREIGN KEY外鍵約束名
1.創建表重命名
CREATE TABLE employees(
employee_id INT PRIMARY KEY,
employee_name VARCHAR(50) NOT NULL,
`email` VARCHAR(25),
department_id INT(3) ZEROFILL NOT NULL, -- 這個字段的數據類型,必須與 departments表的department_id字段 的數據類型一致
CONSTRAINT fk_department_id FOREIGN KEY (department_id) REFERENCES departments(department_id)
-- 用employees表的department_id 去引用 departments表的department_id字段 做外鍵關聯。
)
2.表已存在時重命名
ALTER TABLE employees
DROP FOREIGN KEY fk_department_id, -- 先刪除外鍵約束
ADD CONSTRAINT fk_department_id FOREIGN KEY (department_id) REFERENCES departments(department_id)
-- 在采用給表添加表記約束的方法,添加外鍵
4.刪除FOREIGN KEY外鍵約束
mySql:
ALTER TABLE Orders
DROP FOREIGN KEY fk_department_id -- fk_department_id外鍵是約束名字
SQL Server / Oracle / MS Access::
ALTER TABLE Orders
DROP CONSTRAINT fk_department_id -- fk_department_id外鍵是約束名字
7. CHECK檢查約束
1.特點
- CHECK 約束用於限制列中的值的范圍。
2.待完成
8.DEFAULT 默認約束
1.特點
- DEFAULT 約束用於向列中插入默認值
- 如果沒有規定其他的值,那么會將默認值添加到所有的新記錄。
2.添加 DEFAULT 約束
1.創建表時添加
下面的 SQL 在 "Persons" 表創建時在 "City" 列創建 DEFAULT 默認約束:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons(
Id_P INT NOT NULL,
LastName VARCHAR(50) NOT NULL,
FirstName VARCHAR(50),
Address VARCHAR(50),
City VARCHAR(50) DEFAULT '大連' -- 在不指定字段的值的時候,默認值為大連
)
通過使用類似 GETDATE() 這樣的函數,DEFAULT 約束也可以用於插入系統值:
待完成
2.表已存在時添加
當表已被創建時,如需在 "City" 列創建 DEFAULT 約束,請使用下列 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
MODIFY COLUMN City VARCHAR(50) DEFAULT '大連' ; -- 通過修改表結構的方式,來對字段添加約束
ALTER TABLE Persons
ALTER City SET DEFAULT '大連'; -- 直接對字段添加DEFAULT
3. 修改DEFAULT約束的值
當表和字段的默認約束都存在時,可以添加約束的方法重新設置 默認約束的值,請使用下列 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
MODIFY COLUMN City VARCHAR(50) DEFAULT '大連' ; -- 通過修改表結構的方式,約束的默認值
ALTER TABLE Persons
ALTER City SET DEFAULT '大連'; -- 通過添加約束的方法也可以修改 已有的約束值
4. 刪除DEFAULT約束
MySQL / SQL Server / Oracle / MS Access::
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT -- 通過DROP來刪除指定字段的 DEFAULT約束
ALTER TABLE Persons
MODIFY COLUMN City VARCHAR(50) -- 通過修改字段,把字段的約束條件去掉
