流水账第十二章

学习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`))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值