【问题标题】:Truncate a table in SQL workbench截断 SQL 工作台中的表
【发布时间】:2021-04-02 21:21:21
【问题描述】:

我有两个表:Person 和 Customer,具有相同的 PK(“客户”是 person 的子类型:person (SSN) 的 pk 是相同的客户 PK)。这些表通过识别关系连接。

当我尝试截断父表“客户”时,我收到以下错误消息:

'不能截断外键约束中引用的表"

CONSTRAINT `fk_Customer_T_Person_T1`
    FOREIGN KEY (`Person_T_SSN`)
    REFERENCES `db`.`Prson_T` (`SSN`)
    ON DELETE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

如您所见,我已经添加了“关于删除级联”的约束:当亲自删除一行时,表中的客户将被删除,该行与已删除的 SSN 相同。

但是当我尝试截断时,它不起作用。为什么?

【问题讨论】:

  • 是否存在与要截断的表相关的第三个表?
  • 是的,还有另一个表,MANAGER,它是PERSON的另一个子类型,与标识关系@Akina连接

标签: mysql sql database


【解决方案1】:

来自documentation

为实现高性能,TRUNCATE TABLE 绕过了 DML 方法 的删除数据。因此,(...) 不能对 InnoDB 表执行 具有父子外键关系,(...)

(重点:我)

要使ON DELETE CASCADE 触发,请使用普通的DML DELETE

【讨论】:

  • 所以,要删除“PERSON”中的所有行,我只需要:DELETE FROM db.Person_T; ?我可以看到结果与 TRUNCATE db.Person_T 相同; (所有行都应该被取消)。删除它可以工作,而截断则不行。那么,我应该使用 DELETE 吗?没有问题吗?
  • @Jenny:是的,DELETE 没有WHERE 子句只会删除表中的所有行。本身没有“问题”,但如文档TRUNCATE 中所述,可以更快,因为跳过了所有 DML 处理。但当然,如果你需要,你不能跳过它。
  • @Jenny 在一些在线小提琴上使用 DELETE 语句重现您的问题(真实完整的结构,每张表 3-5 行)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2011-08-27
  • 2012-10-21
  • 1970-01-01
相关资源
最近更新 更多