Mysql有6种约束
- NOT NULL 非空约束,规定某个字段不能为空
- UNIQUE 唯一键,规定某个字段在整个表中是唯一的
- PRIMARY KEY 主键(非空且唯一)
- FOREIGN KEY 外键
- CHECK 检查约束
- DEFAULT 默认值
注意:Mysql不支持check约束,但可以使用,而没有任何效果.
1. 非空
非空约束用于确保当前列的值不为NULL值,非空约束只能出现在表对象的列上。
Null类型特征:
所有的类型的值都可以是null,包括int、float等数据类型
空字符串””不等于null,0也不等于null,false不等于null
create table 表名称( 属性1 数据类型 primary key, 属性 数据类型 not null, 属性 数据类型 not null default 缺省值, ); |
2. 唯一
同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束的时候,如果不给唯一约束名称,就默认和列名相同。
MySQL会给唯一约束的列上默认创建一个唯一索引;
唯一约束,允许出现多个空值:NULL。
创建唯一约束的两种方式
在新建表的时候的就指定唯一键
create table 表名称( 属性1 数据类型 primary key, 属性2 数据类型 unique, 属性3 数据类型, 属性4 数据类型 unique, ); |
表已经存在,增加唯一键
ALTER TABLE t_mytable ADD UNIQUE (列名称) |
3. 主键
主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值,如果是多列组合的主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。
MySQL的主键名总是PRIMARY。
当创建主键约束时,MySQL默认会在所在的列和列组合上建立对应的主键索引。
create table 表名称( 属性1 数据类型 primary key, 属性2 数据类型, 属性3 数据类型, ); |
表已经存在,增加主键,也可以指定多列
ALTER TABLE t_mytable ADD PRIMARY KEY (主键列); |
ALTER TABLE t_mytable ADD PRIMARY KEY (主键列…); |
4. 外键
外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。从表(子表)参照(reference)主表。
•建立外键约束只能在表级别上创建。
•在创建外键约束时,如果不给外键约束名称,外键也有默认名,也可以指定外键名。
•当创建外键约束时,系统默认会在所在的列上建立对应的普通索引。
•同一个表可以有多个外键约束
•从表的外键列,在主表中引用的只能是主键或唯一键的列。
•从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样
•从表的外键值必须"在主表中能找到"或者为空
•当主表的记录被从表参照时,主表中被参考记录的删除和更新也会受到限制。
(1)默认情况下,主表和从表是严格依赖关系RESTRICT。当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据。
(2)但是有一种是级联删除:
–ONDELETE SET NULL(级联置空):当外键设置了SETNULL,当主表的相关记录删除时,从表对应的字段改为NULL。
–ONDELETE CASCADE(级联删除):当外键设置了CASCADE(级联),当主表的相关记录删除时,从表对应的行都删除了。
对于外键约束,最好是采用: ON UPDATE CASCADE ON DELETE RESTRICT的方式
定义外键
在创建表的时候指定外键,外键是表级约束,需要另起一行.
【constraint 约束名】 foreign key (从表的字段) references 主表名(主表被参考字段) |
create table employee( eid int primary key, ename varchar(20) not null, tel char(11), salary double, department_id int, constraint fk_emp_dept_did foreign key (department_id) references department(did) on delete set null on update cascade ); |
已经完成表的创建了,添加外键
alter table 表名称 add 【constraint 约束名】 foreign key(从表字段名) references 主表名(主表中被参考字段); |
alter table employee add constraint fk_emp_dept_did foreign key (department_id) references department(did); |
删除外键
alter table 表名称 drop foreign key 约束名; |
alter table employee drop foreign key fk_emp_dept_did; |
如何查看一个表的约束信息:
select * from information_schema.table_constraints where table_name = '表名称'; |
select * from information_schema.table_constraints where table_name = 'employee'; |