MySql约束

常见的约束类型(5种)

  1. not null: 非空约束,指定某列不为空
  2. unique:唯一约束,指定某列和几列组合的数据不能重复
  3. primary key:主键约束,指定某列的数据不能重复,唯一
  4. foreign key:外键,指定该列记录属于主表中的一条记录,参照另一条数据
  5. 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)

 

原文地址:https://www.cnblogs.com/xiebinbbb/p/13839039.html