约束的分类
1、NOT NULL
非空约束,用于约束字段值不能为空
2、DEFAULT
默认约束,用于约束字段有默认值
3、PRIMARY KEY
主键约束,用于约束字段的唯一、非空属性
4、UNIQUE
唯一约束,用于约束字段具有唯一的值
5、CHECK
检查约束,用于检查数据表中字段是否有效
6、FOREIGN KEY
外键约束,通常与主键一起使用,确保数据的一致性
创建表使添加约束
-- students表
CREATE TABLE student (
id INT AUTO_INCREMENT PRIMARY KEY, -- 主键自增
name VARCHAR(50) NOT NULL, -- 非空字段
gender ENUM('Male', 'Female') NOT NULL, -- 枚举类型
age TINYINT UNSIGNED CHECK (age >= 18), -- 检查约束
email VARCHAR(255) UNIQUE, -- 唯一性约束
department_id INT NOT NULL, -- 外键约束
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 默认值约束
CONSTRAINT fk_department FOREIGN KEY (department_id) REFERENCES department(id)
);
-- department表
CREATE TABLE department (
id INT AUTO_INCREMENT PRIMARY KEY, -- 主键自增
name VARCHAR(50) NOT NULL -- 非空字段
);
解释:
id
声明为主键,并使用AUTO_INCREMENT
关键字进行自增。name
声明为VARCHAR(50)
类型的非空字段,即NOT NULL
。gender
声明为ENUM('Male', 'Female')
类型的非空字段,即只能取这两个枚举值。age
声明为TINYINT UNSIGNED
类型,使用 CHECK 约束确保其值大于等于 18。email
声明为 VARCHAR(255) 类型的唯一性约束字段,即UNIQUE
。department_id
声明为 INT 类型的外键约束字段,即NOT NULL
,并在最后定义了一个名为fk_department
的外键约束,它关联到department
表中的 id 字段。created_at
声明为TIMESTAMP
类型,并设置默认值为当前时间戳,即DEFAULT CURRENT_TIMESTAMP
。CONSTRAINT
关键字用于在创建表时定义约束条件,它可以用于定义多种类型的约束,包括主键、唯一、检查、外键等。
修改表并删除约束
这将删除名为 email
的索引,因为默认情况下唯一性约束是通过创建一个唯一索引
来实现的。
ALTER ATBLE student
DROP INDEX email
如果我们显式地为一个列创建唯一性约束,并且给这个约束命名,例如:
ALTER TABLE student
ADD CONSTRAINT uk_email UNIQUE (email);
这将为 student
表中的 email
列创建一个名为 uk_email
的唯一性约束。要删除这个唯一性约束,就需要使用 DROP CONSTRAINT
语法来删除它,而不能直接使用 DROP INDEX
。因为这种情况下,唯一性约束和唯一性索引不再是同一个概念。
ALTER TABLE student DROP CONSTRAINT uk_email;
修改表添加约束条件
-- 添加唯一约束
ALTER TABLE student
ADD UNIQUE(email);
-- 添加外键约束条件
ALTER TABLE student
ADD CONSTRAINT fk_department
FOREIGN KEY (department_id)
REFERENCE department(id);