约束保证数据的完整性和一致性
约束按功能分为PRIMARY KEY、UNIQUE KEY、DEFAULT、NOT NULL、FOREIGN KEY
按数目分为列级约束和表级约束
查看约束
|
|
主键约束:PRIMARY KEY
主键可以写为PRIMARY KEY,也可以写成KEY
- 唯一性(可以赋值但是不能给两个记录赋一样的值)每张表只存在一个主键
- 主键保证记录的唯一性
- 主键自动为NOT NULL,也就是说必须要为主键赋值。但如果主键选择了AUTO_INCREMENT,那么不需要手动赋值
- auto_increment必须和主键primary key一起使用,但是主键primary key不一定要和auto_increment一块使用
- 主键的字段是可以赋值的,但不能赋相同的值
|
|
记录如果删除了编号会出现间断
自增 AUTO_INCREMENT
- 自动编号,保证记录的唯一性,且必须与主键组合使用
- 默认情况下,初始为1,每次增长量为1.
- 对应的字段设置必须是数值类型,若是浮点类型,小数位必须为0.
- 自动编号必须是主键字段
|
|
AUTO_INCREMENT必须是主键
主键不一定要用AUTO_INCREMENT
唯一约束:UNIQUE KEY
- 唯一约束可以保证记录的唯一性
- 唯一约束的字段可以为空值(NULL),存储时只保留一个NULL
- 每张数据表可以存在多个唯一约束
|
|
默认约束:DEFAULT
如果没有明确为字段赋值会自动赋与默认值
非空约束:NOT NULL
NULL,字段值可以为空
NOT NULL,字段值禁止为空,不赋值会报错
外键约束:FOREIGN KEY
保持数据一致性,完整性;实现一对一或一对多关系
要求:
- 父表和子表必须使用相同的存储引擎,而且禁止使用临时表(子表:具有外键列的表;父表:子表参照的表)
- 数据表的存储引擎只能为InnoDB
- 外键列和参照列必须具有类似的数据类型。其中数字的长度或是否有符号位必须相同;而字符的长度则可以不同
- 外键列和参照列必须创建索引。如果外键列不存在索引的话,MySQL将自动创建索引
在配置文件(my.ini\my.conf)中编辑默认的存储引擎:
|
|
显示创建表的语句:SHOW CREATE TABLE table_name;
查看表是否有索引:SHOW INDEXS FROM table_name;
以网格查看表是否有索引:SHOW INDEXS FROM table_name\G;
外键约束的参照操作
- CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行
- SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL
- RESTRICT:拒绝对父表的删除或更新操作
- NO ACTION:标准SQL的关键字,在MySQL中与RESTRICT相同
|
|
从父表删除或更新行,会设置子表中的外键列为NULL,如果使用该选项,必须保证子表列没有指定NOT NULL
实际开发中,我们很少使用物理的外键约束,而是使用逻辑约束;物理的外键约束只有innoDB这种存储引擎才会支持,MYISAM这种引擎就不支持物理的外键约束。反过来说,当我们使用到的引擎为MYISAM时,只能使用逻辑外键(即两个表的设计的逻辑关系)。
表级约束与列级约束
对一个数据列建立的约束,称为列级约束
对多个数据列建立的约束,称为表级约束
列级约束既可以在列定义时声明,也可以在列定以后声明
表级约束只能在列定义后声明
主键、外键、唯一既可以作为表级约束,也可作为列级约束
not null、default只有列级约束