Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在SQL workbench中截断表_Mysql_Sql_Database - Fatal编程技术网

Mysql 在SQL workbench中截断表

Mysql 在SQL workbench中截断表,mysql,sql,database,Mysql,Sql,Database,我有两个表:Person和Customer,具有相同的PK(“Customer”是Person的子类型:Person的PK(SSN)是Customer的相同PK)。这些表通过标识关系连接 当我试图截断父表“customer”时,我收到以下错误消息: '无法截断外键约束中引用的表' 正如您所看到的,我已经添加了约束“on delete cascade”:当亲自删除一行时,表customer中的行将被删除,该行具有与已删除行相同的SSN 但当我尝试截断时,它不起作用。为什么?来自: 为了实现高性能,

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

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

'无法截断外键约束中引用的表'

正如您所看到的,我已经添加了约束“on delete cascade”:当亲自删除一行时,表customer中的行将被删除,该行具有与已删除行相同的SSN

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

来自:

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

(强调:我)

要使DELETE CASCADE上的
启动,请使用以下位置的普通DML
DELETE

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

(强调:我)


要使DELETE CASCADE上的
启动,请使用普通的DML
DELETE

因此,要删除“PERSON”中的所有行,我只需执行:DELETE FROM db.PERSON\T;?我可以看到结果与TRUNCATE db.PERSON\T相同;(所有行都应取消)。使用delete时有效,而使用truncate时无效。那么,我应该使用delete吗?没有问题?@Jenny:是的,
delete
没有
WHERE
子句只会删除表中的所有行。没有“问题”“就其本身而言,但如文档
中所述,TRUNCATE
可以更快,因为所有DML处理都被跳过。但当然,如果您需要,您不能跳过它。@Jenny在一些在线提琴上用DELETE语句重现您的问题(真实完整的结构,每个表3-5行)。因此,要删除“PERSON”中的所有行,我只需执行以下操作:从db.PERSON_?我可以看到结果与TRUNCATE db.Person\T相同;(应取消所有行)。使用delete可以工作,而使用truncate不能工作。那么,我应该使用DELETE吗?没问题吗?@Jenny:是的,
DELETE
没有
WHERE
子句,只删除表中的所有行。本质上没有“问题”,但如文档中所述,TRUNCATE可以更快,因为所有DML处理都被跳过。但当然,如果您需要,您不能跳过它。@Jenny在一些在线小提琴上用DELETE语句重现您的问题(真实完整的结构,每个表3-5行)。是否存在与要截断的表相关的第三个表?是的,还有另一个表,即MANAGER,它是PERSON的另一个子类型,与标识关系@AkinaDoes连接存在与要截断的表相关的第三个表?是的,还有另一个表MANAGER,它是PERSON的另一个子类型,与标识关系@Akina连接
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;