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 | email | 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) -- 通过修改字段,把字段的约束条件去掉