学习MySQL—约束
一、主键约束
作用:它能够唯一确定一张表中的一条记录,通过某个字段添加约束,就可以使得该字段不重复且不为空。
1.1创建表
mysql> create table user(
-> id int primary key,
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.02 sec)
1.2添加数据
mysql> insert into user values(1,'张三');
Query OK, 1 row affected (0.00 sec)
1.3再添加相同约束值/空值会报错
mysql> insert into user values(1,'张三')
ERROR 1062 (23000): Duplicate entry '1' for key 'user.PRIMARY'
mysql> insert into user values(null,'张三')
ERROR 1048 (23000): Column 'id' cannot be null
1.4正确添加
mysql> insert into user values(2,'张三');
Query OK, 1 row affected (0.01 sec)
--查询
mysql> select * from user;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 张三 |
+----+--------+
2 rows in set (0.00 sec)
1.5联合主键
--创建多个主键约束 只要联合的主键加起来不重复就可 空值不行
mysql> create table user2(
-> id int,
-> name varchar(20),
-> password varchar(20),
-> primary key(id,name)
-> );
Query OK, 0 rows affected (0.01 sec)
1.5.1 添加数据
mysql> insert into user2 values(1,'张三','123');
Query OK, 1 row affected (0.00 sec)
mysql> insert into user2 values(2,'张三','123');
Query OK, 1 row affected (0.01 sec)
mysql> insert into user2 values(1,'李四','123');
Query OK, 1 row affected (0.01 sec)
mysql> insert into user2 values(NULL,'李四','123');
ERROR 1048 (23000): Column 'id' cannot be null
二、自增约束
作用:自动管控约束值
2.1新建表
create table user3(
id int primary key auto_increment,
name varchar(20)
);
2.2添加数据
insert into user3 (name) values('张三');
--查询 自动添加id:1
mysql> select * from user3;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
+----+--------+
1 row in set (0.00 sec)
insert into user3 (name) values('李四');
--查询 自动添加id:2
mysql> select * from user3;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 李四 |
+----+--------+
2 rows in set (0.00 sec)
2.3查询KEY中有主键
mysql> describe 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)
2.3 建表忘记创建主键约束 自主添加约束
2.3.1 新建无约束表
create table user4(
id int,
name varchar(20)
);
2.3.2 查询无约束表 KEY为空
mysql> describe user4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
2.3.3手动添加约束
alter table user4 add primary key(id);
--验证此时user4表key中有约束
mysql> describe user4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
2.3.4删除约束
alter table user4 drop primary key;
--验证此时user4表key中无约束
mysql> describe user4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
2.3.5用modify修改字段,添加约束 (少用)
alter table user4 modify id int primary key;
三、唯一约束
3.1 创建唯一约束的方法
3.1.1 外加约束
creat table user5(
id int,
name varchar(20)
);
alter table user5 add primary key(id);
3.1.2 建表就创建约束 inique()括号里面可添加多个约束
creat table user5(
id int,
name varchar(20),
unique(name)
);
--等同于 但是上面可添加多个约束
creat table user5(
id int,
name varchar(20) unique
);
--
3.1.3 用modify方法添加
alter table user5 modify name varchar(20)
3.2删除唯一约束
3.2.1 单个约束删除
alter table user5 drop index name;
3.2.2 多个约束删除
alter table user4 drop primary key;
五、非空约束
作用:修饰字段不能为空NULL
5.1 新建表 not null
create table user6 (
id int,
name varchar(20) not null
);
--查看null
mysql> desc user6;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(20) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
5.2 此时id可为空 name不能为空的
5.2.1 若name为空 则报错
mysql> insert into user6 (id) values(1);
--ERROR 1364 (HY000): Field 'name' doesn't have a default value
5.2.2 id没有约束 空则不会报错
mysql> insert into user6 (name) values('张三');
Query OK, 1 row affected (0.00 sec)
--检查
mysql> select * from user6;
+------+--------+
| id | name |
+------+--------+
| NULL | 张三 |
+------+--------+
1 row in set (0.00 sec)
六、默认约束
作用:当我们没有给修饰字段传值时,就会使用默认值
6.1 创建表 空值则导入默认值
create table user7(
id int,
name varchar(20),
age int default 10
);
--查询表结构 Default
mysql> desc user7;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| age | int | YES | | 10 | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
6.2插入数据
6.2.1 不导入数据
insert into user7(id,name) values(1,'张三');
--查询数据 自动导入10
mysql> select * from user7;
+------+--------+------+
| id | name | age |
+------+--------+------+
| 1 | 张三 | 10 |
+------+--------+------+
1 row in set (0.00 sec)
6.2.2 导入数据
insert into user7 values(1,'张三',21);
--查询数据 有数据则不导入默认值
mysql> select * from user7;
+------+--------+------+
| id | name | age |
+------+--------+------+
| 1 | 张三 | 10 |
| 1 | 张三 | 21 |
+------+--------+------+
2 rows in set (0.00 sec)
七、外键约束
作用:1.父表classes中没有的数值,在子表中是不可以使用的。
2.父表中的记录被子表引用后,是不可以被删除的。
7.1 创建父表(主表) 班级
create table classes(
id int primary key,
name varchar(20)
);
7.2 创建子表(副表) 学生
create table students(
id int primary key,
name varchar(20),
class_id int,
foreign key(class_id) references classes(id)
);
7.3添加父表calsses数据
insert into classes values(1,'一班');
insert into classes values(2,'二班');
insert into classes values(3,'三班');
insert into classes values(4,'四班');
--查询classes数据
mysql> select * from classes;
+----+--------+
| id | name |
+----+--------+
| 1 | 一班 |
| 2 | 二班 |
| 3 | 三班 |
| 4 | 四班 |
+----+--------+
4 rows in set (0.00 sec)
7.4添加子表students数据
7.4.1添加父表范围内的数据 正确
insert into students values(1001,'张三',1);
insert into students values(1002,'李四',2);
insert into students values(1003,'王五',3);
insert into students values(1004,'赵六',4);
7.4.2添加父表范围外的数据(5,'五班') 报错
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`))
7.5删除父表中的记录 报错
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`))
2038

被折叠的 条评论
为什么被折叠?



