MySql约束
常见的约束类型(5种)
- not null: 非空约束,指定某列不为空
- unique:唯一约束,指定某列和几列组合的数据不能重复
- primary key:主键约束,指定某列的数据不能重复,唯一
- foreign key:外键,指定该列记录属于主表中的一条记录,参照另一条数据
- check:检查,指定一个表达式,用于检验指定数据
unique唯一约束
1.唯一约束是指定table的列或列组合不能重复,保证数据的唯一性,约束的列不允许有重复值;
2.唯一约束不允许出现重复的值,但是可以为多个null;
3.同一个表可以有多个唯一约束,多个列组合的约束
mysql> create table temp_uk( -> id int not null unique, -> name varchar(20) unique); mysql> insert into temp_uk values(1,'a'); mysql> insert into temp_uk values(2,'a'); ERROR 1062 (23000): Duplicate entry 'a' for key 'name' mysql> insert into temp_uk values(2,null); mysql> insert into temp_uk values(3,null); mysql> select * from temp_uk; +----+------+ | id | name | +----+------+ | 2 | NULL | | 3 | NULL | | 1 | a | +----+------+
可见,唯一性约束的列可以有多个null值,因为null <> null
4.在创建唯一约束时,如果不给唯一约束名称,就默认和列名相同;
5.唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束。
primary key主键约束
primary key = not null + unique
主键:用来唯一的标示表中的每一行(类型一般为整型或者字符串)
具有主键约束的列不允许有null值,并且不允许有重复值;
每个表最多只允许一个主键(可定义联合主键),主键名总是PRIMARY。
mysql> create table temp_pk( -> id int primary key); mysql> insert into temp_pk values(1),(2); mysql> insert into temp_pk values(1); ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' mysql> update temp_pk set id=1 where id=2; ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' mysql> insert into temp_pk values(null); ERROR 1048 (23000): Column 'id' cannot be null
!!给主键一个新的名字,但在数据字典中,主键名还是显示primary
联合主键(用几个列进行唯一标识一行)
mysql> create table temp_pk( -> id int, -> name varchar(20), -> constraint pk_id_name primary key(id,name) -> ); Query OK, 0 rows affected (0.06 sec) mysql> desc temp_pk; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(20) | NO | PRI | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> insert into temp_pk values(1,'张三'); Query OK, 1 row affected (0.00 sec) mysql> insert into temp_pk values(2,'李四'); Query OK, 1 row affected (0.01 sec) mysql> insert into temp_pk values(1,'王五'); Query OK, 1 row affected (0.00 sec) mysql> insert into temp_pk values(1,'张三'); ERROR 1062 (23000): Duplicate entry '1-张三' for key 'PRIMARY' mysql> select * from temp_pk; +----+--------+ | id | name | +----+--------+ | 1 | 张三 | | 1 | 王五 | | 2 | 李四 | +----+--------+ 3 rows in set (0.00 sec)