无法使用级联删除删除或更新 parent 行约束冲突
Cannot delete or update a parent row constraint violation with cascade remove
我有 2 个实体:信息 和 可能的答案
信息可以看作是一个问题,根据它的类型,它可以有可能的答案。它也可以有一个 child 信息,如果 parent 信息 有 PossibleAnswers,其中之一会触发 child dipslay。
信息 class :
/**
* @ORM\Entity(repositoryClass="App\Repository\InformationRepository")
*/
class Information
{
use DateTrait;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @var string
*
* @ORM\Column(type="string")
* @Assert\NotBlank()
*/
private $name;
/**
* @var string
*
* @ORM\Column(type="string")
* @Assert\NotBlank()
*/
private $type;
/**
* @ORM\OneToMany(targetEntity="App\Entity\PossibleAnswer", mappedBy="information", cascade={"persist", "remove"}, orphanRemoval=true)
*/
private $possibleanswers;
/**
* One Information has Many Informations.
* @ORM\OneToMany(targetEntity="Information", mappedBy="parent", cascade={"remove"}, orphanRemoval=true)
* @ORM\OrderBy({"rank" = "ASC"})
*/
private $children;
/**
* Many Informations have One Information.
* @ORM\ManyToOne(targetEntity="Information", inversedBy="children")
*/
private $parent;
/**
* réponse qui déclenche une sous question
* @ORM\ManyToOne(targetEntity="PossibleAnswer")
*/
private $trigger;
可能的答案 class :
/**
* @ORM\Entity(repositoryClass="App\Repository\PossibleAnswerRepository")
*/
class PossibleAnswer
{
use DateTrait;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Information", inversedBy="possibleanswers")
*/
private $information;
/**
* @var string
*
* @ORM\Column(type="string")
* @Assert\NotBlank()
*/
private $value;
现在我想删除一个特定的信息并删除每一个 PossibleAnswer 或 child 信息。但是有些删除案例不起作用:
- 单身信息:OK
- 信息 child 信息:OK
- 包含可能答案的信息:好的
- 包含触发 child 信息的 PossibleAnswers 的信息:KO
- 包含 child 可能答案的信息:KO
情况4:
An exception occurred while executing 'DELETE FROM possible_answer
WHERE id = ?' with params [28]:
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or
update a parent row: a foreign key constraint fails
(evisa
.information
, CONSTRAINT FK_297918835FDDDCD6
FOREIGN KEY
(trigger_id
) REFERENCES possible_answer
(id
))
案例 5:
An exception occurred while executing 'DELETE FROM information WHERE
id = ?' with params [56]:
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or
update a parent row: a foreign key constraint fails
(db
.possible_answer
, CONSTRAINT FK_3D79739D2EF03101
FOREIGN
KEY (information_id
) REFERENCES information
(id
))
我在级联中遗漏了正确删除所有内容的内容,但我找不到它是什么。
您正在使用 ORM 级级联,您想要实现的是数据库级级联 http://www.inanzzz.com/index.php/post/6s4g/one-to-many-association-cascade-example-with-doctrine-annotations
你需要的是 onDelete="CASCADE"
例如:
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Information", inversedBy="possibleanswers")
* @JoinColumn(onDelete="CASCADE")
*/
private $information;
始终使用 JoinColumn 你将更好地控制你的代码并手动命名列,否则你最终会在你的数据库中出现混乱,一些名称将是 CamelCase 一些 snake_case.
我有 2 个实体:信息 和 可能的答案 信息可以看作是一个问题,根据它的类型,它可以有可能的答案。它也可以有一个 child 信息,如果 parent 信息 有 PossibleAnswers,其中之一会触发 child dipslay。
信息 class :
/**
* @ORM\Entity(repositoryClass="App\Repository\InformationRepository")
*/
class Information
{
use DateTrait;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @var string
*
* @ORM\Column(type="string")
* @Assert\NotBlank()
*/
private $name;
/**
* @var string
*
* @ORM\Column(type="string")
* @Assert\NotBlank()
*/
private $type;
/**
* @ORM\OneToMany(targetEntity="App\Entity\PossibleAnswer", mappedBy="information", cascade={"persist", "remove"}, orphanRemoval=true)
*/
private $possibleanswers;
/**
* One Information has Many Informations.
* @ORM\OneToMany(targetEntity="Information", mappedBy="parent", cascade={"remove"}, orphanRemoval=true)
* @ORM\OrderBy({"rank" = "ASC"})
*/
private $children;
/**
* Many Informations have One Information.
* @ORM\ManyToOne(targetEntity="Information", inversedBy="children")
*/
private $parent;
/**
* réponse qui déclenche une sous question
* @ORM\ManyToOne(targetEntity="PossibleAnswer")
*/
private $trigger;
可能的答案 class :
/**
* @ORM\Entity(repositoryClass="App\Repository\PossibleAnswerRepository")
*/
class PossibleAnswer
{
use DateTrait;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Information", inversedBy="possibleanswers")
*/
private $information;
/**
* @var string
*
* @ORM\Column(type="string")
* @Assert\NotBlank()
*/
private $value;
现在我想删除一个特定的信息并删除每一个 PossibleAnswer 或 child 信息。但是有些删除案例不起作用:
- 单身信息:OK
- 信息 child 信息:OK
- 包含可能答案的信息:好的
- 包含触发 child 信息的 PossibleAnswers 的信息:KO
- 包含 child 可能答案的信息:KO
情况4:
An exception occurred while executing 'DELETE FROM possible_answer WHERE id = ?' with params [28]:
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (
evisa
.information
, CONSTRAINTFK_297918835FDDDCD6
FOREIGN KEY (trigger_id
) REFERENCESpossible_answer
(id
))
案例 5:
An exception occurred while executing 'DELETE FROM information WHERE id = ?' with params [56]:
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (
db
.possible_answer
, CONSTRAINTFK_3D79739D2EF03101
FOREIGN KEY (information_id
) REFERENCESinformation
(id
))
我在级联中遗漏了正确删除所有内容的内容,但我找不到它是什么。
您正在使用 ORM 级级联,您想要实现的是数据库级级联 http://www.inanzzz.com/index.php/post/6s4g/one-to-many-association-cascade-example-with-doctrine-annotations
你需要的是 onDelete="CASCADE"
例如:
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Information", inversedBy="possibleanswers")
* @JoinColumn(onDelete="CASCADE")
*/
private $information;
始终使用 JoinColumn 你将更好地控制你的代码并手动命名列,否则你最终会在你的数据库中出现混乱,一些名称将是 CamelCase 一些 snake_case.