簡體   English   中英

處理數據庫完整性

[英]Handling database integrity

我正在使用innodb約束在我的應用程序的下一個版本中引入數據庫完整性。 一切順利,但我的一些表有記錄與刪除的引用(死記錄),因為他們我不能添加約束到表。

我在嘗試:

ALTER TABLE `article` ADD FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`) ON DELETE CASCADE;

我得到:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`books`.<result 2 when explaining filename '#sql-442_dc'>, CONSTRAINT `#sql-442_dc_ibfk_1` FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`) ON DELETE CASCADE)

運行此查詢,我發現超過500條記錄沒有引用(作者被刪除,但他們的文章仍然存在):

SELECT `articles`.`id`
FROM `articles` LEFT JOIN `authors` ON `articles`.`author_id` = `authors`.`id`
WHERE ISNULL(`authors`.`id`);

所以,在我添加約束之前,我必須處理這些約束。 如何刪除使用上述查詢獲得的所有記錄?

我試過了:

DELETE FROM `articles` WHERE `id` IN (
  SELECT `articles`.`id`
  FROM `articles` LEFT JOIN `authors` ON `articles`.`author_id` = `authors`.`id`
  WHERE ISNULL(`authors`.`id`);
)

但是mysql響應:

You can't specify target table 'articles' for update in FROM clause

任何有關這方面的幫助將不勝感激。

我不太熟悉mySql的許多怪癖,但是這也應該有用,也許mySql不會阻塞它:

delete from articles
 where not exists (
           select id from authors
            where authors.id = articles.author_id
       )

嗯,當然我們在嘗試基於集合的刪除之前總是有一個表的備份:)

暫無
暫無

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

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