簡體   English   中英

如何在 MySQL 5.X 中不啟用 CASCADE DELETE 的情況下使用外鍵刪除表中的行

[英]How delete rowns in tables with foreign key without enabling CASCADE DELETE in MySQL 5.X

此圖顯示數據庫圖

SET  @ID = (SELECT ID FROM pessoa WHERE CPF=123456);
SET  @ID = (SELECT ENDERECO FROM pessoa WHERE CPF=123456);
SET @TELEFONES = (SELECT ID_TELEFONE FROM pessoa_telefone WHERE ID_PESSOA=@ID);
SET @TIPOS = (SELECT TIPO FROM telefone WHERE ID IN (@TELEFONES));

DELETE FROM pessoa_telefone WHERE ID_PESSOA=@ID;

DELETE FROM pessoa WHERE ID=@ID;
DELETE FROM endereco WHERE ID=@ENDERECO;

DELETE FROM telefone WHERE ID IN (@TELEFONES);
DELETE FROM telefone_tipo WHERE ID IN (@TIPOS);

這段代碼有效,但如何減少到這樣的事情:

DELETE FROM pessoa_telefone, pessoa, endereco, telefone, telefone_tipo
JOIN pessoa, JOIN endereco,
JOIN telefone, JOIN telefone_tipo
ON pessoa_telefone.ID_PESSOA = pessoa.ID
ON pessoa.ENDERECO = endereco.ID
ON telefone.TIPO = telefone_tipo.ID
WHERE pessoa.CPF = 123456

根據MySQL 5.7 文檔,如果不使用InnoDB 表(有外鍵約束),您可以使用多表刪除。

在這種情況下,下面的代碼應該可以工作:

delete pt, p, t, tp, e
from pessoa_telefone pt 
inner join pessoa p on p.id = pt.id_pessoa
inner join telefone t on t.id = pt.id_telefone
inner join telefone_tipo tp on tp.id = t.tipo
inner join endereco e on e.id = p.endereco
where p.cpf = '123456';

如果您正在使用InnoDB(有外鍵約束的表),再次根據MySQL 5.7 文檔“您應該從單個表中刪除並依賴 InnoDB 提供的 ON DELETE 功能來導致其他表被修改相應地”

此外,還有許多其他類似堆棧溢出的問題。 請參閱(已標記為重復)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM