MySQL基础关键_009_DDL 和 DML(二)
目 录
一、DML
1.插入数据(insert)
(1)说明
(2)实例
2.修改数据(update)
(1)说明
(2)实例
3.删除数据(delete)
(1)说明
(2)实例
二、约束
1.说明
2.非空约束
3.检查约束
4.唯一性约束
(1)说明
(2)列级约束
(3)表级约束
(4)约束起别名
5.主键约束
(1)说明
(2)单一主键
(3)复合主键(不推荐)
(4)主键自增
6.外键约束
(1)说明
(2)单一外键
(3)级联删除
(4)级联更新
(5)级联置空
一、DML
1.插入数据(insert)
(1)说明
- 语法格式:
- 【INSERT INTO 表名(字段1, 字段2, 字段3, ……) VALUES(值1, 值2, 值3, ……);】;
- 【INSERT INTO 表名 VALUES(值1, 值2, 值3, ……);】。
- 表名后字段括号内容如果省略不写,意味着自动将表中所有字段都列出来了,顺序与建表时的顺序一致,此时值需要与之一一对应、不可或缺;
- 可以一次插入多条数据,每一组 value 用逗号相隔。
(2)实例
创建一个 persons 表,并插入多条数据。
-- 创建表
create table persons(id int,name varchar(10),gender char(2) default '未知',age int
);-- 插入数据
insert into persons(id, name, gender, age)
values(1, '张三', '男', 18),(2, '李四', '女', 18),(3, '王五', '未知', 18);
2.修改数据(update)
(1)说明
- 语法格式:【UPDATE 表名 SET 字段名1 = 值1, 字段名2 = 值2,…… WHERE 条件;】;
- 若没有更新条件,则所有数据全部更新。
(2)实例
将 id 是 “2” 的人员年龄修改为 33。
update persons set age = 33 where id = 2;
3.删除数据(delete)
(1)说明
- DML 删除语法格式:
- 删除全部记录:【DELETE FROM 表名;】;
- 删除条件记录:【DELETE FROM 表名 WHERE 条件;】。
- DML 方式删除的数据可以通过事务回滚重新恢复,但是删除效率较低;
- 截断删除语法格式:【TRUNCATE TABLE 表名;】;
- 截断删除不属于 DML,删除效率高,但不可恢复。
(2)实例
先删除 name 是“李四”的数据,之后再将 persons 表截断删除。
-- DML 删除
delete from persons where name = '李四';-- 截断删除
truncate table persons;
二、约束
1.说明
- 创建表时可以为字段添加约束,如此可以保证数据的完整性、有效性;
- 分类:
- 非空约束:not null;
- 检查约束:check;
- 唯一性约束:unique;
- 主键约束:primary key;
- 外键约束:foreign key。
2.非空约束
如果之前有 persons 表请删除。创建 persons 表,指定 name 字段非空。
drop table if exists persons;create table persons(id int,name varchar(10) not null,age int
);
-- 插入数据时,name 字段不能为空,否则报错
3.检查约束
如果之前有 persons 表请删除。创建 persons 表,指定人员必须成年。
drop table if exists persons;create table persons(id int,name varchar(10),age int,check(age >= 18)
);
-- 插入数据时,年龄必须大于等于 18, 否则报错
4.唯一性约束
(1)说明
唯一性字段值可以为 null;
在字段后边添加 unique 是列级约束;
在最后添加 unique 是表级约束,表级约束可以为多个字段添加联合唯一;
创建约束时可以给约束起别名;
所有约束存储在自带数据库 information_schema 的系统表 table_constraints 当中。
(2)列级约束
如果之前有 persons 表请删除。创建 persons 表,指定 name 唯一。
drop table if exists persons;create table persons(id int,name varchar(10) unique,email varchar(255)
);
-- 插入数据时,name 字段值必须唯一, 否则报错
(3)表级约束
如果之前有 persons 表请删除。创建 persons 表,指定 name,email 联合唯一。
drop table if exists persons;create table persons(id int,name varchar(10),email varchar(255),unique(name, email)
);
-- 插入数据时,name, email 字段值必须联合唯一, 否则报错
(4)约束起别名
drop table if exists persons;create table persons(id int,name varchar(10),email varchar(255),constraint persons_name_email_unique unique(name, email)
);
-- constraint 是关键字, persons_name_email_unique 是此约束别名
5.主键约束
(1)说明
主键约束字段不能为 null 且不能重复;
任何一张表都应该有主键,否则可视为是无效表;
主键值是该条记录的唯一标识。即使两条数据相同,但是主键不同,也会被认为是两天不同的数据;
分类:
按照字段数量:
单一主键:一个字段作为主键(推荐);
复合主键:多个字段作为主键。
按照业务:
自然主键:主键和任何业务无关(推荐);
业务主键:主键和业务联系,例如:将账号作为主键。
主键是一个自然数字,MySQL 的主键可以自增。
(2)单一主键
如果之前有 persons 表请删除。创建 persons 表,指定 id 为主键。
drop table if exists persons;create table persons(id int primary key,name varchar(10),email varchar(255)
);
-- id 被设置为主键
(3)复合主键(不推荐)
如果之前有 persons 表请删除。创建 persons 表,指定 id,name 为复合主键。
drop table if exists persons;create table persons(id int,name varchar(10),email varchar(255),primary key(id, name)
);
-- id,name 被设置为复合主键,也可以起别名,此条语句可以写为:
-- constraints persons_id_name_pk primary key(id, name)
-- constraints 是关键字,persons_id_name_pk primary 是此主键别名
(4)主键自增
如果之前有 persons 表请删除。创建 persons 表,指定 id 为主键并自增。
drop table if exists persons;create table persons(id int primary key auto_increment,name varchar(10),email varchar(255)
);
-- id 被设置为主键并自增,MySQL 自动维护
6.外键约束
(1)说明
- 添加了外键约束的字段的值必须来自其他字段。例如:a 字段添加了外键约束,要求 a 字段中的值必须来自 b 字段,b 字段不一定是主键,但也需要具有唯一性;
- 外键约束可以为单个字段添加,称为单一外键。也可以为多个字段联合添加,称为复合外键,但较少使用;
- 若 a 表引用 b 表中的数据,可以将 b 表称为父表,a 表称为子表。操作顺序如下:
- 创建表时,先创建父表,再创建子表;
- 插入数据时,先插入父表,再插入子表;
- 删除数据时,先删除子表,再删除父表;
- 删除表时,先删除子表,再删除父表。
(2)单一外键
创建两张表,分别是 schools(学校表)、teachers(教师表)。
schools 表字段:id(主键)、name;
teachers 表字段:id(主键)、name、age、school_id(外键)。
创建完成之后自行插入几条数据,sql 脚本如下:
drop table if exists teachers;
drop table if exists schools;-- 学校表
create table schools(id int primary key,name varchar(255)
);-- 插入数据
insert into schools values(1, '山河四省实验中学'),(2, '山西省直属第二中学校'),(3, '山东省直属第三中学校'),(4, '河南省直属第四中学校'),(5, '河北省直属第五中学校');-- 教师表
create table teachers(id int primary key auto_increment,name varchar(255),age int,school_id int,constraint teachers_sid_fk foreign key(school_id) references schools(id)
);-- 插入数据
insert into teachers(name, age, school_id) values('王明', 23, 2),('邱钰红', 22, 3),('宋刚', 18, 5),('李志强', 17, 1),('胡建国', 19, 4);
(3)级联删除
创建子表时,在外键可以添加 on delete cascade。如此在删除父表数据时子表会级联删除,谨慎使用。
# 删除外键约束
alter table teachers drop constraint teachers_sid_fk;# 添加级联删除外键约束
alter table teachers add constraint teachers_sid_fk foreign key(school_id) references schools(id) on delete cascade;# 级联删除:删除 schools 中的某条数据,会将 schools 表中 id 对应 teachers 表中 school_id 的数据一并删除
delete from schools where id = '1';# 查询两表全部信息
select * from schools;
select * from teachers;
(4)级联更新
创建子表时,在外键可以添加 on update cascade。如此在修改父表数据时子表会级联更新。
# 删除级联删除外键约束
alter table teachers drop constraint teachers_sid_fk;# 添加级联更新外键约束
alter table teachers add constraint teachers_sid_fk foreign key(school_id) references schools(id) on update cascade;# 级联更新:更新 schools 中的某条数据,会将 schools 表中 id 对应 teachers 表中 school_id 的数据一并更新
update schools set id = '9' where name = '山西省直属第二中学校';# 查询两表全部信息
select * from schools;
select * from teachers;
(5)级联置空
创建子表时,在外键可以添加 on delete set null。如此在删除父表数据时子表会级联置空。
# 删除级联更新外键约束
alter table teachers drop constraint teachers_sid_fk;# 添加级联置空外键约束
alter table teachers add constraint teachers_sid_fk foreign key(school_id) references schools(id) on delete set null;# 级联置空:删除 schools 中的某条数据,会将 schools 表中 id 对应 teachers 表中 school_id 的数据置空
delete from schools where id = '3';# 查询两表全部信息
select * from schools;
select * from teachers;