DELETE
FROM table_name
[WHERE conditions]
[ORDER BY ...]
[LIMIT row_count];
DELETE
FROM emp_devp
WHERE emp_name = '关平';
DELETE
FROM emp_devp
ORDER BY salary DESC
LIMIT 1;
DELETE
FROM department
WHERE dept_id = 1;
ERROR 1452 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`ds`.`employee`, CONSTRAINT `fk_emp_dept` FOREIGN KEY (`dept_id`) REFERENCES `department` (`dept_id`))
mysql> DELETE IGNORE
-> FROM department
-> WHERE dept_id = 1;
Query OK, 1 row affected, 1 warning (0.09 sec)
mysql> show warnings;
+---------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Warning | 1451 | Cannot delete or update a parent row: a foreign key constraint fails (`ds`.`employee`, CONSTRAINT `fk_emp_dept` FOREIGN KEY (`dept_id`) REFERENCES `department` (`dept_id`)) |
+---------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
CREATE TABLE t_parent(id int NOT NULL PRIMARY KEY, c1 int);
INSERT INTO t_parent VALUES (1, 1), (2, 2);
CREATE TABLE t_child(
id int NOT NULL PRIMARY KEY,
pid int NOT NULL,
FOREIGN KEY (pid)
REFERENCES t_parent (id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
INSERT INTO t_child VALUES (1, 1), (2, 1), (3, 2);
SELECT * FROM t_child;
id|pid|
--|---|
1| 1|
2| 1|
3| 2|
DELETE
FROM t_parent
WHERE id = 1;
SELECT * FROM t_child;
id|pid|
--|---|
3| 2|
TRUNCATE [TABLE] table_name;
TRUNCATE TABLE emp_devp;
TRUNCATE 删除并重建表,通常比 DELETE 快很多,尤其对于大表而言;
TRUNCATE 会进行隐式提交,所以无法回滚;
TRUNCATE 语句需要获取表上的独占锁;
如果存在外键约束,父表无法使用 TRUNCATE 语句;除非是自引用的外键约束;
TRUNCATE 语句通常返回“0 rows affected”,不代表被删除的数据行数;
TRUNCATE 语句会将表中的 AUTO_INCREMENT 重置为初始值;
TRUNCATE 语句不会触发 ON DELETE 触发器。
DELETE table_name
FROM table_name
[INNER JOIN | LEFT JOIN] other_table ON conditions
WHERE conditions;
DELETE
FROM table_name
USING table_name
[INNER JOIN | LEFT JOIN] other_table ON conditions
WHERE conditions;
DELETE ed
FROM emp_devp ed
LEFT JOIN employee e ON (e.emp_id = ed.emp_id)
WHERE e.emp_id IS NULL;
DELETE
FROM ed
USING emp_devp ed
LEFT JOIN employee e ON (e.emp_id = ed.emp_id)
WHERE e.emp_id IS NULL;
DELETE
FROM emp_devp
WHERE emp_id NOT IN (SELECT emp_id FROM employee);
DELETE t1, t2
FROM t1
[INNER JOIN | LEFT JOIN] t2 ON conditions
[INNER JOIN | LEFT JOIN] other_table ON conditions
WHERE conditions;
DELETE
FROM t1, t2
USING t1
[INNER JOIN | LEFT JOIN] t2 ON conditions
[INNER JOIN | LEFT JOIN] other_table ON conditions
WHERE conditions;
DELETE
FROM p, c
USING t_parent p
INNER JOIN t_child c ON (c.pid = p.id)
WHERE p.c1 = 2;
原文作者:SQL编程思想;如有侵权,请联系管理员删除。