如何在使用 ManyToMany 字段的 MySQL 中截断表

问题描述 投票:0回答:2

我在 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;
}
php mysql symfony many-to-many
2个回答
2
投票

要截断具有多对多关系的表,您需要暂时禁用外键检查,截断相关表,然后再次启用外键检查。由于您想通过控制台执行此操作,因此可以使用 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 命令应该适用于您的用例。


0
投票

现在您在 middle_table 中的外键不允许您从 Projects 表中删除记录。换句话说,您在 middle_table 中有一个指向 Project 的链接,它没有机会从 Project 中删除行。因此,您应该更改外键的定义以允许删除,您可以将链接设置为空或进行级联删除。我更喜欢第二个选项,所以将注释更改为以下,它应该允许您删除 Projects 表中的行,它还会删除指向 middle_table 中的 Project 的链接。

class Project {

  /**
  * @ORM\ManyToMany(targetEntity="Shipping", mappedBy="projects", cascade={"remove"})
  **/
  private $employee;
}

文档:
学说关联映射
mysql 外键约束

© www.soinside.com 2019 - 2024. All rights reserved.