约束是用来限定表中数据准确性、完整性、一致性、联动性的一套规则。
约束是在表上强制执行的数据校验规则.
约束主要用于保证数据库的完整性。
当表中数据有相互依赖性时,可以保护相关的数据不被删除.
常见的约束类型
非空 not null
唯一性 unique
自增长 auto_increment
默认值 default
主键 primary key
外键 foreign key
约束 Check
约束作为数据库对象,存放在系统表中,也有自己的名字
创建约束的时机
在建表的同时创建
建表后创建(修改表)
可定义列级或表级约束
有单列约束和多列约束
非空约束
列级约束,只能使用列级约束语法定义。
NULL,字段允许为空。默认为NULL
NOT NULL,字段禁止为空。
所有数据类型的值都可以是NULL。
空字符串,0都不等于NULL。
CREATE TABLE stu2 (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(18) NOT NULL
);
insert into tb (name) values ("abc");
唯一性
unique
唯一性约束条件确保所在的字段或者字段组合不出现重复值.
唯一约束可以是空值(NULL),且可以为多个null
每张表可以有多个唯一约束
唯一约束可由多列组合而成
建唯一约束时MySQL会为之建立对应的索引。
如果不给唯一约束起名,该唯一约束默认与列名相同
CREATE TABLE stu3 (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(18) UNIQUE NOT NULL
)
自增长
auto_increment
自动编号,必须与主键组合使用
默认情况下,从1开始,每次增长为1
默认值
当插入记录时,如未给字段赋值,则自动赋予默认值
主键
primary key
主键从功能上看相当于非空且唯一
主键自动定义为非空约束
主键自动定义为唯一性约束
每张表最多只能有一个主键
主键字段可以是单字段或者是多字段的组合
当建立主键约束时, MySQL为主键创建对应的索引
主键约束名总为PRIMARY
CREATE TABLE stu4(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(18)
)
外键
foreign key
保证数据的一致性,完整性。
实现一对一或一对多的关系。
当前表内,指向其他表的主键的字段,称之为外键!
外键是构建于一个表的两个字段或者两个表的两个字段之间的关系
外键确保了相关的两个字段的两个关系:
子(从)表外键列的值必须在主表参照列值的范围内,或者为空(也
可以加非空约束,强制不允许为空)。
当主表的记录被子表参照时,主表记录不允许被删除。
外键参照的只能是主表主键或者唯一键,保证子表记录可以准确定位到被参照的记录。
格式FOREIGN KEY (外键列名)REFERENCES 主表(参照列)
只有InnoDB类型的表才可以使用外键, mysql默认是
MyISAM,这种类型不支持外键约束.
程序设计时不要使用外键,在代码中控制两中的一至性。
CREATE TABLE tb_dept(
dept_id INT PRIMARY KEY,
NAME VARCHAR(18),
description VARCHAR(255)
);
CREATE TABLE tb_employee(
employee_id INT PRIMARY KEY,
NAME VARCHAR(18),
gender VARCHAR(10),
dept_id INT REFERENCES tb_dept(dept_id),
address VARCHAR(255)
);
Check 约束
既可作为列级约束,也可作为表级约束
定义在字段上的每一记录都要满足的条件
在check中定义检查的条件表达式,数据需要符合设置的条件
条件表达式不允许使用
–参照其他记录的值
CREATE TABLE tb_student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(18),
age INT CHECK(age > 18 AND age < 60)
);
列级约束与表级约束
列级约束直接跟在列后定义,不再需要指定列名,与列定义之间用空格分开
表级约束通常放在所有的列定义之后定义,要显式指定对哪些列建立列级约束。与列定义之间采
用英语逗号,隔开。
如果是对多列建联合约束,只能使用表级约束语法
增加约束
可增加或删除约束,但不能直接修改
可使约束启用和禁用
非空约束必须使用MODIFY子句增加
只要是可以使用列级约束语法来定义的约束,都可以通过modify来增加该约束。
–ALTER TABLE table
–ADD [CONSTRAINT constraint] type
(column);
删除约束
约束可被删除,删除约束不会对数据产生影响
当删除被外键参照的主键时候,应该采用
CASCADE关键字来级联删除外键,否则无法删除主键
语法如下
–alter table 表名drop constraint 约束名
非空约束可以通过modify来增加非空约束,或删除非空约束
–增加: alter table 表名modify 列名not null
–删除: alter table 表名modify 列名null
但add constraint 的用法不能用来增加非空约束
可以采用drop constraint 约束名的用法来删除非空约束
欢迎关注