删除记录
DELETE FROM
Syntax
DELETE FROM table_name
WHERE conditions;
没有 WHERE 条件是清空全表内容,比较危险。
Example
DELETE FROM tb_student WHERE stu_id = 1004;
DELETE FROM tb_student WHERE stu_id = 1002 OR stu_id = 1003;
DELETE FROM tb_student WHERE stu_id IN (1002, 1003);
- 删除条件比较常用的是主键列,可以精确定位
=是比较运算符,不是赋值IN是成员运算符
Safe update mode
DELETE FROM tb_student
MySQL 默认开启“Safe update mode”,清空全表的时候会报错,阻止你清空全表。可以关闭这个模式,但不建议:
SHOW VARIABLES LIKE '%safe%';

Delete record with foreign key constraint
如果删除的表有外键约束,且指向的表中有这条数据,删除的时候会报错。
| stu_id | stu_name | stu_gender | stu_birth | col_id |
|---|---|---|---|---|
| 1001 | Jack | Male | 02/26/1995 | 101 |
| col_id | col_name | col_tel |
|---|---|---|
| 101 | '计算机学院' | '021-12345678' |
| 102 | '外国语学院' | '021-12345679' |
DELETE FROM tb_college WHERE col_id = 101; # OK
DELETE FROM tb_college WHERE col_id = 103; # ERROR
如果非要删除 tb_college 表中的 103 数据,就需要先修改 tb_student 表中的外键约束:
ALTER TABLE tb_student DROP CONSTRAINT fk_student_cid;
ALTER TABLE tb_student ADD CONSTRAINT fk_student_cid
FOREIGN KEY (col_id) REFERENCES tb_college (col_id)
# default: 如果 tb_student 中有属于这个学院的学生,就不让删除这个学院
ON DELETE RESTRICT;
如果 tb_student 中有属于这个学院的学生,删这个学院学院的时候,tb_student 表也会删除这个学生:
ON DELETE CASCADE;
如果 tb_student 中有属于这个学院的学生,删这个学院学院的时候,tb_student 表也这个学生 col_id 列会设为空值,前提是该列允许设置为空:
ON DELETE SET NULL;
tip
定义外键约束的时候,推荐使用默认的 RESTRICT,比较安全,平时很少使用。