我在 MySQL 中有一个表,它有一个 ManyToMany 字段,我想截断该表,但是当我尝试它时,我得到以下错误:
ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint ...
我将 Symfony 与 Doctrine 一起使用,但如果可能的话,我有兴趣学习如何通过控制台进行操作
class Project {
/**
* @ORM\ManyToMany(targetEntity="Shipping", mappedBy="projects")
**/
private $employee;
}
class Employee{
/**
* @ORM\ManyToMany(targetEntity="Product", inversedBy="employee")
* @ORM\JoinTable(name="middle_table")
**/
protected $projects;
}
要截断具有多对多关系的表,您需要暂时禁用外键检查,截断相关表,然后再次启用外键检查。由于您想通过控制台执行此操作,因此可以使用 MySQL 命令执行以下步骤:
SET FOREIGN_KEY_CHECKS = 0; -- Disable foreign key checking.
TRUNCATE TABLE forums;
TRUNCATE TABLE dates;
TRUNCATE TABLE remarks;
SET FOREIGN_KEY_CHECKS = 1; -- Enable foreign key checking.
请记住,截断表会从表中删除所有数据,因此在执行这些命令时要小心。如有必要,请确保备份您的数据。
如果你在 Symfony 中使用 Doctrine,你可以通过使用 Doctrine 连接执行原始 SQL 查询来获得相同的结果。但是,由于您对使用控制台感兴趣,因此上述 MySQL 命令应该适用于您的用例。
现在您在 middle_table 中的外键不允许您从 Projects 表中删除记录。换句话说,您在 middle_table 中有一个指向 Project 的链接,它没有机会从 Project 中删除行。因此,您应该更改外键的定义以允许删除,您可以将链接设置为空或进行级联删除。我更喜欢第二个选项,所以将注释更改为以下,它应该允许您删除 Projects 表中的行,它还会删除指向 middle_table 中的 Project 的链接。
class Project {
/**
* @ORM\ManyToMany(targetEntity="Shipping", mappedBy="projects", cascade={"remove"})
**/
private $employee;
}
文档:
学说关联映射
mysql 外键约束