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),我们将第一时间核实后及时予以删除。