数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。
为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制。从以下四个方面考虑:
约束是表级的强制规定。
可以在创建表时通过CREATE TABLE 语句规定约束,或者表创建之后通过ALTER TABLE 语句规定约束。
位置 | 支持的约束类型 | 是否可以起约束名 | |
---|---|---|---|
列级约束 | 列的后面 | 语法都支持,但外键没有效果 | 不可以 |
表级约束 | 所有列的后面 | 默认和非空不支持,其他支持 | 可以(主键没有效果) |
根据约束起的作用,约束可分为:
查看表已有的约束
SELECT * FROM information_schema.table_constraints
WHERE table_name = '表名称';
-- 添加非空约束
CREATE TABLE 表名称(
字段名 数据类型,
字段名 数据类型 NOT NULL,
字段名 数据类型 NOT NULL
);
ALTER TABLE 表名称
MODIFY 字段名 数据类型 NOT NULL;
-- 删除非空约束
ALTER TABLE 表名称 MODIFY 字段名 数据类型 NULL;
ALTER TABLE 表名称 MODIFY 字段名 数据类型;
-- 添加唯一约束
CREATE TABLE test2(
id INT UNIQUE , -- 列级约束
last_name VARCHAR(15),
email VARCHAR(25),
-- 表级约束
CONSTRAINT uk_test2_email UNIQUE(email)
);
-- 字段列表中如果是一个字段,表示该列的值唯一。如果两个或更多个字段,那么多个字段的组合是唯一的。
ALTER TABLE 表名称 ADD UNIQUE KEY(字段列表);
AlTER TABLE 表名称 MODIFY 字段名 字段类型 UNIQUE;
-- 复合唯一约束
CREATE TABLE 表名称(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型,
UNIQUE KEY(字段列表) -- 字段列表中写的是多个字段名,多个字段名用逗号分隔,表示复合唯一,即多个字段的组合是唯一的。
)
CREATE TABLE test(
column1 INT,
column2 VARCHAR,
column3 DECIMAL,
UNIQUE KEY(column1, column2)
)
-- 删除唯一约束
SELECT * FROM information_schema.table_constraints WHERE table_name = '表名'; -- 查看表的约束
ALTER TABLE USER
DROP INDEX uk_name_pwd;
-- 可以通过 SHOW INDEX FROM 表名称;查看表的索引
-- 添加主键约束
CREATE TABLE 表名称(
字段名 数据类型 PRIMARY KEY, -- 列级模式
字段名 数据类型,
字段名 数据类型
);
CREATE TABLE 表名称(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型,
[CONSTRAINT 约束名] PRIMARY KEY(字段名) -- 表级模式
);
ALTER TABLE 表名称 ADD PRIMARY KEY(字段列表); -- 字段列表可以是一个字段,也可以是多个字段,如果是多个字段即为复合主键
-- 复合主键
CREATE TABLE 表名称(
字段名1 数据类型,
字段名2 数据类型,
字段名3 数据类型,
PRIMARY KEY(字段名1, 字段名2)
);
-- 删除主键约束
ALTER TABLE 表名称 DROP PRIMARY KEY;
-- 删除主键约束,不需要指定主键名,因为一个表只有一个主键,删除主键约束后,非空还存在
-- 指定自增约束
CREATE TABLE 表名称(
字段名 数据类型 PRIMARY KEY AUTO_INCREMENT,
字段名 数据类型 UNIQUE KEY NOT NULL,
字段名 数据类型 UNIQUE KEY,
字段名 数据类型 NOT NULL DEFAULT 默认值
);
CREATE TABLE 表名称(
字段名 数据类型 DEFAULT 默认值,
字段名 数据类型 UNIQUE KEY AUTO_INCREMENT,
字段名 数据类型 NOT NULL DEFAULT 默认值,
PRIMARY KEY(字段名)
);
ALTER TABLE 表名称 MODIFY 字段名 数据类型 AUTO_INCREMENT;
-- 删除自增约束
ALTER TABLE 表名称 MODIFY 字段名 数据类型;
-- 添加外键约束
CREATE TABLE 主表名称(
字段1 数据类型 PRIMARY KEY,
字段2 数据类型
);
CREATE TABLE 从表名称(
字段1 数据类型 PRIMARY KEY,
字段2 数据类型,
[CONSTRAINT <外键约束名称>] FOREIGN KEY (从表的某个字段) REFERENCES 主表名(被参考字段)
);
ALTER TABLE 从表名 ADD [CONSTRAINT 约束名] FOREIGN KEY (从表的字段) REFERENCES 主表名(被引用字段) [ON UPDATE xx][ON DELETE xx];
-- 删除外键约束
-- 1.查看约束名和删除外键约束
SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';
ALTER TABLE 从表名 DROP FOREIGN KEY 外键约束名;
-- 2.查看索引名和删除索引
SHOW INDEX FROM 表名称;
ALTER TABLE 从表名 DROP INDEX 索引名;
CREATE TABLE emp(
eid INT PRIMARY KEY,
ename VARCHAR(5),
gender CHAR CHECK('男' OR '女'),
age TINYINT CHECK(age>20),
sex CHAR(2) CHECK(sex in('男', '女')),
height INT CHECK(height>=0 AND height<3)
);
-- 添加默认值约束
CREATE TABLE 表名称(
字段名 数据类型 PRIMARY KEY,
字段名 数据类型 UNIQUE KEY NOT NULL,
字段名 数据类型 UNIQUE KEY,
字段名 数据类型 NOT NULL DEFAULT 默认值,
字段名 数据类型 DEFAULT 默认值
);
ALTER TABLE 表名称 MODIFY 字段名 数据类型 DEFAULT 默认值;
-- 删除默认值约束
ALTER TABLE 表名称 MODIFY 字段名 数据类型;