使用DELETE语句能否造成外键约束违反?TRUNCATE与DELETE真题疑问
Oracle 1z0-071真题解析
原题
下列关于TRUNCATE和DELETE的描述中,正确的是?
A. 只要会违反外键约束,就绝对无法对表执行TRUNCATE操作
B. 处理大表时,TRUNCATE的执行速度比DELETE更快
C. 对于带有多个索引和触发器的表,DELETE的执行速度比TRUNCATE更快
D. 只要会违反外键约束,就绝对无法删除表中的行
正确答案:B
D选项错误原因
你测试时使用的是默认无级联规则的外键约束,所以会出现父表存在关联子表数据时无法删除的情况,但Oracle外键支持两种级联配置,满足条件时即使删除操作原本会触发外键违反,也可以正常执行:
- 外键设置
ON DELETE CASCADE:删除父表行时,数据库会自动同步删除子表中所有关联的行,不会触发约束报错 - 外键设置
ON DELETE SET NULL:删除父表行时,数据库会自动将子表关联行的外键字段设为NULL,只要子表外键字段允许为空,就不会触发约束报错
级联删除场景验证代码
-- 创建父表 CREATE TABLE question (id INTEGER PRIMARY KEY); -- 创建子表,外键配置级联删除规则 CREATE TABLE answer (fk INTEGER REFERENCES question(id) ON DELETE CASCADE); INSERT INTO question VALUES (1); INSERT INTO answer VALUES (1); COMMIT; -- 该语句可正常执行,数据库会自动删除子表中关联的行,无外键约束报错 DELETE FROM question;
运行上述代码即可复现“存在外键关联时也能删除父表行”的场景,直接证明D选项的表述不成立。
其他选项错误补充(可选参考):
- A错误:如果临时禁用引用该表的外键约束,即可正常执行
TRUNCATE,“绝对无法”的表述不成立 - C错误:
TRUNCATE是DDL操作,无需逐行扫描、逐行记录日志,也不会触发DML触发器,无论表上有多少索引和触发器,速度都远快于DELETE
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

