MySQL.常见表选项及约束
1.create table 选项
1.指定列选项 default、comment
2.指定表选项 engine、auto_increment、comment
2.create table 约束
1.非空约束:not null
2.唯一约束:unique
3.主键约束: primary key
4.外键: foreign key
5.检查enum、set:chect
一、create table 选项
a. 定义列的时候,指定列选项
1.default<literal>:定义列的默认值
当插入一个新行到表中并且没有给该列明确赋值,如果定义了列的默认值,将自动得到默认值,如果没有,则为null
也可以在insert和 update 语句中使用 default 关键字给默认值赋值,函数default(column)也得到一个列的默认值
2.comment 用来给列添加注释,最多为255个字符,注释将会保存在数据字典中
b. 在create table 语句中的表选项
1.engine :指定表使用的储存引擎 #储存引擎:决定了表中的数据如何存储以及如何访问,还有事务如何处理
MySQL中允许对每个表使用不同的储存引擎,如果在create table 中没有使用储存引擎,则使用默认的储存引擎。
MySQL > show engines #查询所有支持的储存引擎
(储存引擎是重点)
2.auto_increment :决定当前表中插入第一行时,自增列得到的第一个值是多少
3.comment:给表添加注释
二、create table 约束
作用:可以为列定义约束(constraint)
约束主要是防止非法数据进入表中,确保数据的正确性和一致性(统称数据完整性)
约束也可以防止一个表被删除
注意:1.MySQL中约束保存在表中,可以通过表查询约束信息
2.进行约束的时间:使用create table语句、使用alter table语句
常见的约束类型有5种:1.not null 非空约束,指定某列不能为空
2.unique 唯一约束,指定某列和几列组合的数据不能重复
3.primary key 主键约束,指定某列的数据不能重复、唯一
4.foreign key 外键,指定该列记录属于主表中的一条记录,参照另一条数据
5.check 检查,指定一个表达式,用于检查指定数据
注意:1.not null 约束只能在列级别定义,作用在多个列上约束只能定义在表级别,例如复合主键约束
2.列级别上不能定义外键约束,并且不能给约束起名字,有MySQL自动命名(not null除外)
· 3.表级别上定义的约束可以给约束起名字(check除外)
1.not null 非空约束
作用:确保当前列的值不能为空
注意:非空约束只能出现在表对象的列上
2.unique 唯一约束
a.唯一约束是指table的列或列组合不能重复,保证数据的唯一性,约束的列不允许有重复值
b.唯一约束不可以有重复值但可以有多个null
c.同一个表可以有多个唯一约束,多个列组合的约束
d.在创建唯一约束时,如果不给唯一约束名称时,就默认和列名相同
e.唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束
3.primary key 主键约束
primary key=not null + unique
主键:用来唯一标示表中的每一行(类型一般为整形或者字符串)
具有主键约束的列不允许有null,并且不允许有重复值
每个表最多只允许一个主键(可定义联合主键),主键名总是primary
联合主键(用几个列进行唯一标示一行)
4.foreign key 外键约束
外键约束:参照完整性约束,保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。
注意:1.具有外键约束的列的值不能随便给,必须满足外键所引用的主键的取值
2.一张表中可以引用多个外键
3.外键列默认可以给null值
按照定义,外键必须引用一个主键或唯一健,引用的主键一般在另外一张表中,也可以是本表的主键(后者称为“自引用”)
父子表:外键所在的表叫做子表、从表
外键所引用的主键所在的表叫做父表、主表
注意:父子表是相对而言,表a可以是表b的子表,但同时也可以是表c的父表。
外键的默认删除规则:当删除父表中的行时,如果子表中有依赖于 被删除的父行的子行 存在,那么就不允许删除,并抛出异常(默认对外键使用on delete restrict 或 on delete no action 选项)
外键引用定义:在定义外键约束时,通过使用 on delect cascade 或者 on delect set null 选项,可以改变外键的默认删除规则
1.on delect cascade :级联删除。当删除父表中的行时,如果自表中有依赖于父表的子行存在,那么就连同子行一起删除。!!!比较危险
2.on delect set null :当删除父表中的行时,如果有子表中依赖于被删除的父行的子行存在,那么不删除,而是将子行的外键列设置为null
5.check 约束
MySQL可以使用check约束,但check约束对数据验证没有什么作用。
Oracle中可以使用check约束,有相应的作用。
the check clause is parsed but ignored by all storage engines
定义数据库时,可以使用 ENUM(enumeration,枚举)和set(集合)类型:变通的实现check约束。
两者的区别是:使用ENUM,只能选一个值
使用set,能选多个值 (ENUM,set 的值必须都是字符串类型)
注意:在内部存储enum值时,MySQL会给enum 中每个值一个顺序号码:第一个值的顺序是1,第二个值的顺序是2,以此来推。当排序或比较enum的时候,使用这些顺序号码进行。
set类型:因为可以列举多个值,所以在建表列约束中常被使用到。