一,约束·
1,主键约束
我们可以给数据表的一个数据表添加约束,让它能够唯一确实一个数据表,这个数据被约束后不重复且不唯一:primary key
mysql> use test;
mysql> create table number(
-> id int primary key,
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.09 sec)
mysql> describe number;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.03 sec)
可以注意到key下面变成了PRI说明他是主键元素。
当我们添加重复的id就会报错。
mysql> insert into number value(1,'张三');
Query OK, 1 row affected (0.03 sec)
mysql> insert into number value(1,'张三');
ERROR 1062 (23000): Duplicate entry '1' for key 'number.PRIMARY'
只有我们的id改了不重复才能添加另外一个张三
mysql> select * from number;
+----+------+
| id | name |
+----+------+
| 1 | 张三 |
| 2 | 张三 |
+----+------+
2 rows in set (0.01 sec)
除此之外,主键约束的数据也不能为空
mysql> insert into number value(null,'张三');
ERROR 1048 (23000): Column 'id' cannot be null
2,主键约束-联合主键
在最后用primary key()定义或者在每一个变量后定义
mysql> create table number2(
-> id int,
-> name varchar(20),
-> primary key(id,name)
-> );
Query OK, 0 rows affected (0.07 sec)
mysql> desc number2;
+-------+-------------+------+-----+---------+-------+
| 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> insert into number2 value(1,'张三');
Query OK, 1 row affected (0.02 sec)
mysql> insert into number2 value(2,'李四');
Query OK, 1 row affected (0.01 sec)
mysql> select *from number2;
+----+------+
| id | name |
+----+------+
| 1 | 张三 |
| 2 | 李四 |
+----+------+
如果再添加一条id name都一样的数据就会报错
mysql> insert into number2 value(2,'李四');
ERROR 1062 (23000): Duplicate entry '2-李四' for key 'number2.PRIMARY'
但如果id和name有一个不一样就可以了
mysql> insert into number2 value(1,'李五');
Query OK, 1 row affected (0.02 sec)
mysql> select *from number2;
+----+------+
| id | name |
+----+------+
| 1 | 张三 |
| 1 | 李五 |
| 2 | 李四 |
+----+------+
3 rows in set (0.00 sec)
当然,id和name都不能为空
mysql> insert into number2 value(null,'李四');
ERROR 1048 (23000): Column 'id' cannot be null
mysql> insert into number2 value(2,null);
ERROR 1048 (23000): Column 'name' cannot be null
3,自增约束
在数据后面加上auto_increment就可以使id自加而不用用户自己传
mysql> create table user3(
-> id int primary key auto_increment,
-> name varchar(15)
-> );
Query OK, 0 rows affected (0.08 sec)
mysql> desc user3
-> ;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
mysql> insert into user3 (name) values('张三');
Query OK, 1 row affected (0.02 sec)
mysql> select * from user3;
+----+------+
| id | name |
+----+------+
| 1 | 张三 |
+----+------+
1 row in set (0.00 sec)
可以看出,我们并没有传id进去,而是主动帮我们补全
mysql> insert into user3 (name) values('李四');
Query OK, 1 row affected (0.03 sec)
mysql> select * from user3;
+----+------+
| id | name |
+----+------+
| 1 | 张三 |
| 2 | 李四 |
+----+------+
2 rows in set (0.00 sec)
当我们再传入一个数据之后,id就会进行自增
4,如果我们在建立数据表的时候忘记添加主键约束,我们还可以使用:1)alter table (数据表名称) add (约束) (要约束的数据)
2)使用modify:alter table (数据表名称) modify (要约束的数据) (数据类型+数据约束类型)
mysql> create table use4(
-> id int,
-> name varchar(15)
-> );
Query OK, 0 rows affected (0.07 sec)
mysql> desc use4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
在上面我们并没有对id进行任何的约束
1)当我们为id使用alter…add后,可以看出id已经被添加主键
mysql> alter table use4 add primary key(id);
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc use4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
2)当我们为id使用modify后,可以看出id也已经被添加主键
mysql> alter table use4 modify id int primary key;
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc use4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
5,当我们想要删除主键时,可以使用:
alter table (数据表名称) drop (约束)
mysql> alter table use4 drop primary key;
Query OK, 0 rows affected (0.10 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc use4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
6,唯一约束 unqiue
key数值为uni就是表示数据不能重复!
mysql> alter table use4 add unique(name);
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc use4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(15) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
这样我们就可以给id和name都添加唯一约束,这样当添加新的数据的时候id和name有一个相同都不行,与主键联合约束不一样!
mysql> insert into use4 value(1,'张三');
Query OK, 1 row affected (0.02 sec)
mysql> insert into use4 value(2,'李四');
Query OK, 1 row affected (0.02 sec)
mysql> select * from use4;
+----+------+
| id | name |
+----+------+
| 1 | 张三 |
| 2 | 李四 |
+----+------+
2 rows in set (0.00 sec)
mysql> insert into use4 value(1,'李五');
ERROR 1062 (23000): Duplicate entry '1' for key 'use4.PRIMARY'
mysql> insert into use4 value(3,'李五');
Query OK, 1 row affected (0.02 sec)
7,删除唯一约束主键:alter table (数据表名称) drop index (数据名);
mysql> alter table use4 drop index id;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc use4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(15) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
8,非空约束
在数据表建立的时候,在数据后添加not null就可以
作用就是,数据不能为空。
9,默认约束
简单理解就是给数据设定一个默认值,当你没有传入数据的时候,默认使用设定的默认值。
mysql> create table use5(
-> id int,
-> name varchar(15),
-> age int default 10
-> );
Query OK, 0 rows affected (0.13 sec)
mysql> desc use5;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(15) | YES | | NULL | |
| age | int | YES | | 10 | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> insert into use5 (id,name) value(1,'张三');
Query OK, 1 row affected (0.02 sec)
mysql> insert into use5 value(2,'李四','15');
Query OK, 1 row affected (0.02 sec)
mysql> select * from use5;
+------+------+------+
| id | name | age |
+------+------+------+
| 1 | 张三 | 10 |
| 2 | 李四 | 15 |
+------+------+------+
2 rows in set (0.01 sec)
可以看出,张三的age我们没有填写就默认为10,而李四的age我们填写了就是我们填写的数据。
重点:10外键约束
外键约束一般设计两个表以上:父表和子表
父表:
mysql> create table classes(
-> id int primary key,
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.07 sec)
子表:
mysql> create table students(
-> id int primary key,
-> class_id int,
-> foreign key(class_id) references classes(id)
-> );
Query OK, 0 rows affected (0.08 sec)
父表添加数据:
mysql> insert into classes values(1,'一班');
Query OK, 1 row affected (0.01 sec)
mysql> insert into classes values(2,'二班');
Query OK, 1 row affected (0.02 sec)
mysql> insert into classes values(3,'三班');
Query OK, 1 row affected (0.02 sec)
mysql> insert into classes values(4,'四班');
Query OK, 1 row affected (0.02 sec)
mysql> select *from classes;
+----+------+
| id | name |
+----+------+
| 1 | 一班 |
| 2 | 二班 |
| 3 | 三班 |
| 4 | 四班 |
+----+------+
4 rows in set (0.01 sec)
子表添加数据:
mysql> insert into students values(1001,1);
Query OK, 1 row affected (0.02 sec)
mysql> insert into students values(1002,2);
Query OK, 1 row affected (0.02 sec)
mysql> insert into students values(1003,3);
Query OK, 1 row affected (0.02 sec)
mysql> insert into students values(1004,4);
Query OK, 1 row affected (0.02 sec)
mysql> select *from students;
+------+----------+
| id | class_id |
+------+----------+
| 1001 | 1 |
| 1002 | 2 |
| 1003 | 3 |
| 1004 | 4 |
+------+----------+
4 rows in set (0.00 sec)
注意:1,主表classes没有的数据值,在子表中不可以使用。
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`))
这里因为主表中没有5班这个数值,当子表想添加5班就会报错
2,主表中的记录被子表引用时不能被删除
mysql> delete from classes where id=4;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))