当前位置: 首页 >数据库 > MySQL主键约束

MySQL主键约束

主键不能为空(NULL)、不能重复!!

唯一约束不能重复,但可以为空。

 

1.单主键约束 primary key

mysql> create table user1(-> id int primary key,-> name varchar(20)-> );Query OK, 0 rows affected (0.01 sec)mysql> desc user1;+-------+-------------+------+-----+---------+-------+| Field | Type| Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id| int | NO| PRI | NULL||| name  | varchar(20) | YES  | | NULL||+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)

由于id是主键,因此插入的数据不能有相同的id:

mysql> insert into user1 values(1,'张三');Query OK, 1 row affected (0.00 sec)mysql> insert into user1 values(1,'李四');ERROR 1062 (23000): Duplicate entry '1' for key 'user1.PRIMARY'

但非主键相同可以:

mysql> insert into user1 values(2,'张三');Query OK, 1 row affected (0.00 sec)mysql> select *from user1;+----+--------+| id | name|+----+--------+|  1 | 张三||  2 | 张三|+----+--------+2 rows in set (0.00 sec)

主键不能为空,非主键可以:

mysql> insert into user1 values(NULL,'张三');ERROR 1048 (23000): Column 'id' cannot be null
mysql> insert into user1 values(3,NULL);Query OK, 1 row affected (0.00 sec)mysql> select *from user1;+----+--------+| id | name|+----+--------+| 1 | 张三|| 2 | 张三|| 3 | NULL|+----+--------+3 rows in set (0.01 sec)

 

2.联合主键约束

mysql> create table user2(-> id int,-> name varchar(20),-> password varchar(20),-> primary key(id,name)-> );Query OK, 0 rows affected (0.01 sec)mysql> desc user2;+----------+-------------+------+-----+---------+-------+| Field| Type| Null | Key | Default | Extra |+----------+-------------+------+-----+---------+-------+| id| int | NO| PRI | NULL||| name | varchar(20) | NO| PRI | NULL||| password | varchar(20) | YES  | | NULL||+----------+-------------+------+-----+---------+-------+3 rows in set (0.00 sec)

添加数据,只要主键的两项不全一致就行:

mysql> insert into user2 values(1,'张三','123');Query OK, 1 row affected (0.01 sec)mysql> insert into user2 values(2,'张三','123');Query OK, 1 row affected (0.00 sec)mysql> insert into user2 values(1,'李四','123');Query OK, 1 row affected (0.00 sec)mysql> select *from user2;+----+--------+----------+| id | name| password |+----+--------+----------+|  1 | 张三| 123  ||  1 | 李四| 123  ||  2 | 张三| 123  |+----+--------+----------+3 rows in set (0.00 sec)

但主键不能为空,任何一个都不行:

mysql> insert into user2 values(NULL,'李四','123');ERROR 1048 (23000): Column 'id' cannot be null

 

3.自增约束 auto increment

mysql> create table user3(-> id int primary key auto_increment,-> name varchar(20)-> );Query OK, 0 rows affected (0.01 sec)mysql> desc user3;+-------+-------------+------+-----+---------+----------------+| Field | Type| Null | Key | Default | Extra  |+-------+-------------+------+-----+---------+----------------+| id| int | NO| PRI | NULL| auto_increment || name  | varchar(20) | YES  | | NULL||+-------+-------------+------+-----+---------+----------------+2 rows in set (0.00 sec)

仅添加非主键部分,id默认从1开始:

mysql> insert into user3(name) values('zhangsan');Query OK, 1 row affected (0.00 sec)mysql> insert into user3(name) values('zhangsan');Query OK, 1 row affected (0.00 sec)mysql> insert into user3(name) values('zhangsan');Query OK, 1 row affected (0.00 sec)mysql> select *from user3;+----+----------+| id | name |+----+----------+|  1 | zhangsan ||  2 | zhangsan ||  3 | zhangsan |+----+----------+3 rows in set (0.00 sec)

如果对id有定义,可以仅添加一次:

mysql> delete from user3 where name='zhangsan';Query OK, 3 rows affected (0.00 sec)mysql> insert into user3 values(202201,'zhangsan');Query OK, 1 row affected (0.00 sec)mysql> insert into user3(name) values('zhangsan');Query OK, 1 row affected (0.01 sec)mysql> insert into user3(name) values('zhangsan');Query OK, 1 row affected (0.00 sec)mysql> select *from user3;+--------+----------+| id | name |+--------+----------+| 202201 | zhangsan || 202202 | zhangsan || 202203 | zhangsan |+--------+----------+3 rows in set (0.00 sec)

 

4.建表后添加与删除主键

mysql> create table user4(-> id int,-> name varchar(20)-> );Query OK, 0 rows affected (0.00 sec)mysql> desc user4;+-------+-------------+------+-----+---------+-------+| Field | Type| Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id| int | YES  | | NULL||| name  | varchar(20) | YES  | | NULL||+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)

添加主键:

mysql> alter table user4 add primary key(id);Query OK, 0 rows affected (0.02 sec)Records: 0  Duplicates: 0  Waings: 0mysql> desc user4;+-------+-------------+------+-----+---------+-------+| Field | Type| Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id| int | NO| PRI | NULL||| name  | varchar(20) | YES  | | NULL||+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)

删除主键:

mysql> alter table user4 drop primary key;Query OK, 0 rows affected (0.02 sec)Records: 0  Duplicates: 0  Waings: 0mysql> desc user4;+-------+-------------+------+-----+---------+-------+| Field | Type| Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id| int | NO| | NULL||| name  | varchar(20) | YES  | | NULL||+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)

添加和删除联合主键一样的道理:

mysql> alter table user4 add primary key(id,name);Query OK, 0 rows affected (0.01 sec)Records: 0  Duplicates: 0  Waings: 0mysql> desc user4;+-------+-------------+------+-----+---------+-------+| Field | Type| Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id| int | NO| PRI | NULL||| name  | varchar(20) | NO| PRI | NULL||+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)mysql> alter table user4 drop primary key;Query OK, 0 rows affected (0.02 sec)Records: 0  Duplicates: 0  Waings: 0mysql> desc user4;+-------+-------------+------+-----+---------+-------+| Field | Type| Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id| int | NO| | NULL||| name  | varchar(20) | NO| | NULL||+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)

 

修改主键约束,和添加主键差不多,一般不用这种方法:

mysql> alter table user4 modify id int primary key;Query OK, 0 rows affected (0.01 sec)Records: 0  Duplicates: 0  Waings: 0mysql> desc user4;+-------+-------------+------+-----+---------+-------+| Field | Type| Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id| int | NO| PRI | NULL||| name  | varchar(20) | NO| | NULL||+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)

 

5.唯一约束------约束修饰的字段的值不可以重复(可以为空)

   5.1建表后添加

mysql> create table user5(-> id int,-> name varchar(20)-> );Query OK, 0 rows affected (0.01 sec)mysql> alter table user5 add unique(name);Query OK, 0 rows affected (0.01 sec)Records: 0  Duplicates: 0  Waings: 0mysql> desc user5;+-------+-------------+------+-----+---------+-------+| Field | Type| Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id| int | YES  | | NULL||| name  | varchar(20) | YES  | UNI | NULL||+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)

添加数据(唯一约束下的name字段不能重复):

mysql> insert into user5 values(1,'zhangsan');Query OK, 1 row affected (0.00 sec)mysql> insert into user5 values(1,'zhangsan');ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 'user5.name'mysql> insert into user5 values(1,'lisi');Query OK, 1 row affected (0.00 sec)mysql> insert into user5 values(1,'NULL');Query OK, 1 row affected (0.00 sec)mysql> select *from user5;+------+----------+| id| name |+------+----------+|1 | zhangsan ||1 | lisi ||1 | NULL |+------+----------+3 rows in set (0.00 sec)

 

   5.2建表时添加

mysql> create table user6(-> id int,-> name varchar(20),-> unique(name)-> );Query OK, 0 rows affected (0.01 sec)mysql> desc user6;+-------+-------------+------+-----+---------+-------+| Field | Type| Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id| int | YES  | | NULL||| name  | varchar(20) | YES  | UNI | NULL||+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)

mysql> create table user7(-> id int,-> name varchar(20) unique-> );Query OK, 0 rows affected (0.01 sec)mysql> desc user7;+-------+-------------+------+-----+---------+-------+| Field | Type| Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id| int | YES  | | NULL||| name  | varchar(20) | YES  | UNI | NULL||+-------+-------------+------+-----+---------+-------+2 rows in set (0.01 sec)

 

   5.3添加多个唯一约束(依旧是两个不完全一样就行)

mysql> create table user8(-> id int,-> name varchar(20),-> unique(id,name)-> );Query OK, 0 rows affected (0.01 sec)mysql> desc user8;+-------+-------------+------+-----+---------+-------+| Field | Type| Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id| int | YES  | MUL | NULL||| name  | varchar(20) | YES  | | NULL||+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)mysql> insert into user8 values(1,'zhangsan');Query OK, 1 row affected (0.00 sec)mysql> insert into user8 values(2,'zhangsan');Query OK, 1 row affected (0.00 sec)mysql> select *from user8;+------+----------+| id| name |+------+----------+| NULL | NULL ||1 | zhangsan ||2 | zhangsan |+------+----------+3 rows in set (0.01 sec)

 

   5.4删除唯一约束

mysql> alter table user7 drop index name;Query OK, 0 rows affected (0.01 sec)Records: 0  Duplicates: 0  Waings: 0mysql> desc user7;+-------+-------------+------+-----+---------+-------+| Field | Type| Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id| int | YES  | | NULL||| name  | varchar(20) | YES  | | NULL||+-------+-------------+------+-----+---------+-------+2 rows in set (0.01 sec)

 

   5.5修改唯一约束

mysql> alter table user7 modify name varchar(20) unique;Query OK, 0 rows affected (0.01 sec)Records: 0  Duplicates: 0  Waings: 0mysql> desc user7;+-------+-------------+------+-----+---------+-------+| Field | Type| Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id| int | YES  | | NULL||| name  | varchar(20) | YES  | UNI | NULL||+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)

 

6.非空约束 not null

mysql> create table user9(-> id int,-> name varchar(20) not null-> );Query OK, 0 rows affected (0.01 sec)mysql> desc user9;+-------+-------------+------+-----+---------+-------+| Field | Type| Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id| int | YES  | | NULL||| name  | varchar(20) | NO| | NULL||+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)
mysql> insert into user9(id) values(1);ERROR 1364 (HY000): Field 'name' doesn't have a default value
mysql> insert into user9 values(1,'zhangsan');Query OK, 1 row affected (0.00 sec)mysql> insert into user9(name) values('lisi');Query OK, 1 row affected (0.00 sec)mysql> select *from user9;+------+----------+| id| name |+------+----------+|1 | zhangsan || NULL | lisi |+------+----------+2 rows in set (0.00 sec)

 

7.默认约束--------当我们插入字段值的时候,如果没有传值,就会使用默认值

mysql> insert into user10(id,name) values(1,'zhangsan');Query OK, 1 row affected (0.00 sec)mysql> select *from user10;+------+----------+------+| id| name | age  |+------+----------+------+|1 | zhangsan |10 |+------+----------+------+1 row in set (0.00 sec)mysql> insert into user10 values(1,'zhangsan',19);Query OK, 1 row affected (0.00 sec)mysql> select *from user10;+------+----------+------+| id| name | age  |+------+----------+------+|1 | zhangsan |10 ||1 | zhangsan |19 |+------+----------+------+2 rows in set (0.00 sec)

 

8.外键约束----------涉及到两个表(主表、副表)

mysql> create table classes(-> id int primary key,-> name varchar(20)-> );Query OK, 0 rows affected (0.01 sec)mysql> create table students(-> id int primary key,-> name varchar(20),-> class_id int,-> foreign key(class_id) references classes(id)-> );Query OK, 0 rows affected (0.01 sec)mysql> desc classes;+-------+-------------+------+-----+---------+-------+| Field | Type| Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id| int | NO| PRI | NULL||| name  | varchar(20) | YES  | | NULL||+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)mysql> desc students;+----------+-------------+------+-----+---------+-------+| Field| Type| Null | Key | Default | Extra |+----------+-------------+------+-----+---------+-------+| id| int | NO| PRI | NULL||| name | varchar(20) | YES  | | NULL||| class_id | int | YES  | MUL | NULL||+----------+-------------+------+-----+---------+-------+3 rows in set (0.00 sec)
mysql> insert into classes values(1,'1班');Query OK, 1 row affected (0.00 sec)mysql> insert into classes values(2,'2班');Query OK, 1 row affected (0.00 sec)mysql> insert into classes values(3,'3班');Query OK, 1 row affected (0.00 sec)mysql> insert into classes values(4,'4班');Query OK, 1 row affected (0.00 sec)mysql> select *from classes;+----+------+| id | name |+----+------+|  1 | 1班  ||  2 | 2班  ||  3 | 3班  ||  4 | 4班  |+----+------+4 rows in set (0.00 sec)

--主表classes中没有的数据值,在副表中是不可以使用的

--主表中的记录被副表引用,是不可以被删除的

mysql> insert into students values(1001,'张三',1);Query OK, 1 row affected (0.00 sec)mysql> insert into students values(1002,'张三',2);Query OK, 1 row affected (0.01 sec)mysql> insert into students values(1003,'张三',3);Query OK, 1 row affected (0.00 sec)mysql> insert into students values(1004,'张三',4);Query OK, 1 row affected (0.00 sec)mysql> insert into students values(1005,'张三',5);ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))
mysql
> select *from students;+------+--------+----------+| id| name| class_id |+------+--------+----------+| 1001 | 张三|1 || 1002 | 张三|2 || 1003 | 张三|3 || 1004 | 张三|4 |+------+--------+----------+4 rows in set (0.00 sec)

 

作者:バカなの
来源链接:https://www.cnblogs.com/eisenshu/p/15668451.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaclub.cn/database/118506.html

标签:1364:Field
分享给朋友: