2011-09-07 82 views
2

我正在研究一個項目,該項目利用MySQL數據庫存儲了多個網站上使用的代碼片段。對於每個內容片段,我還會保留一個編輯歷史記錄表,每次更新片段時都會向其添加記錄。偶爾會希望完全刪除代碼段和任何關聯的編輯歷史記錄。設置數據庫時,我將外鍵關係設置爲ON DELETE CASCADE,以便刪除片段將自動刪除歷史記錄。不過,我收到以下錯誤:MySQL即使FK關係ON DELETE CASCADE集也不允許刪除集

Error in query: delete from SNIPPET where id = 1. Cannot delete or update a parent row: a foreign key constraint fails (universal_content_repository/SNIPPET_EDIT_HISTORY , CONSTRAINT fk_SNIPPET_EDIT_HISTORYRelationship13 FOREIGN KEY (snippet_id) REFERENCES SNIPPET (id))

下面是我用它來創建數據庫以及關係代碼:如果你想看到數據庫的圖形表示

/*Schema universal_content_repository*/ 
CREATE SCHEMA IF NOT EXISTS `universal_content_repository` 
DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 

USE `universal_content_repository`; 

CREATE TABLE `universal_content_repository`.`USER` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Stores the ID for the User.', 
`username` VARCHAR(20) NOT NULL, 
`first_name` VARCHAR(32) NOT NULL, 
`last_name` VARCHAR(32) NOT NULL, 
`is_active` VARCHAR(5) NOT NULL DEFAULT true, 
`password` VARCHAR(32) NOT NULL, 
`is_admin` BIT NOT NULL DEFAULT 0, 
`prefers_wysiwyg` BIT DEFAULT 0, 
PRIMARY KEY (`id`) 
) COMMENT 'Stores information about all Users for the Universal Content Repository.' ENGINE=INNODB 
ROW_FORMAT=DEFAULT; 

CREATE TABLE `universal_content_repository`.`SNIPPET` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
`title` VARCHAR(255) NOT NULL, 
`content` TEXT NOT NULL, 
`created_by` INT UNSIGNED, 
`wysiwyg_editable` VARCHAR(6) NOT NULL DEFAULT true, 
`is_enabled` BIT NOT NULL DEFAULT 1, 
PRIMARY KEY (`id`) 
) COMMENT 'Guarantees that no two snippets may have the same name or ID.' ENGINE=INNODB 
ROW_FORMAT=DEFAULT; 

CREATE TABLE `universal_content_repository`.`IMAGE` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
`name` VARCHAR(32) NOT NULL, 
`url` TEXT NOT NULL, 
`alt` VARCHAR(32), 
PRIMARY KEY (`id`) 
) ENGINE=INNODB 
ROW_FORMAT=DEFAULT; 

CREATE TABLE `universal_content_repository`.`IMAGE_IN_SNIPPET` (
`rel_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
`snippet_id` INT UNSIGNED, 
`image_id` INT UNSIGNED, 
`position` INT COMMENT 'Stores the position of the image within the snippet, as notated in the snippet as [index]', 
PRIMARY KEY (`rel_id`) 
) ENGINE=INNODB 
ROW_FORMAT=DEFAULT; 

CREATE TABLE `universal_content_repository`.`SNIPPET_EDIT_HISTORY` (
`revision_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
`editing_user` INT UNSIGNED, 
`snippet_id` INT UNSIGNED, 
`old_contents` TEXT NOT NULL COMMENT 'Stores the old contents of the snippet.', 
`edit_date` DATETIME NOT NULL COMMENT 'Stores the DateTime of the edit.', 
PRIMARY KEY (`revision_id`) 
) ENGINE=INNODB 
ROW_FORMAT=DEFAULT; 

CREATE TABLE `universal_content_repository`.`SESSION` (
`id` VARCHAR(32) NOT NULL COMMENT 'Stores the Session ID', 
`access` INT(10) UNSIGNED NOT NULL, 
`data` TEXT, 
PRIMARY KEY (`id`) 
) ENGINE=INNODB 
ROW_FORMAT=DEFAULT; 

ALTER TABLE `universal_content_repository`.`USER` ADD UNIQUE `Identifiers` (`id`,`username`); 

ALTER TABLE `universal_content_repository`.`SNIPPET` ADD UNIQUE `identifiers` (`title`,`id`); 

ALTER TABLE `universal_content_repository`.`SNIPPET` ADD CONSTRAINT `fk_SNIPPETRelationship8` FOREIGN KEY (`created_by`) REFERENCES `universal_content_repository`.`USER`(`id`) MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT; 

ALTER TABLE `universal_content_repository`.`IMAGE_IN_SNIPPET` ADD CONSTRAINT `fk_IMAGE_IN_SNIPPETRelationship10` FOREIGN KEY (`snippet_id`) REFERENCES `universal_content_repository`.`SNIPPET`(`id`) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE; 

ALTER TABLE `universal_content_repository`.`IMAGE_IN_SNIPPET` ADD CONSTRAINT `fk_IMAGE_IN_SNIPPETRelationship11` FOREIGN KEY (`image_id`) REFERENCES `universal_content_repository`.`IMAGE`(`id`) MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT; 

ALTER TABLE `universal_content_repository`.`SNIPPET_EDIT_HISTORY` ADD CONSTRAINT `fk_SNIPPET_EDIT_HISTORYRelationship12` FOREIGN KEY (`editing_user`) REFERENCES `universal_content_repository`.`USER`(`id`) MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT; 

ALTER TABLE `universal_content_repository`.`SNIPPET_EDIT_HISTORY` ADD CONSTRAINT `fk_SNIPPET_EDIT_HISTORYRelationship13` FOREIGN KEY (`snippet_id`) REFERENCES `universal_content_repository`.`SNIPPET`(`id`) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE; 

,你可以在SchemaBank看到它。 對於那些沒有SchemaBank帳戶,這裏是ER: UCR Schema

任何想法?

+0

Schemabank需要登錄,所以它沒用。 – Johan

+0

我繼續爲你添加一個png。 –

+0

我不知道爲什麼它這樣做。我可以給你一個AFTER DELETE TRIGGER形式的解決方法,刪除所有'snippet_edit_history',但只是繞過這個問題。 – Johan

回答

0

看起來你的代碼是正確的。

如果可行,轉儲該數據庫並將其恢復到另一臺服務器上作爲測試。如果INNODB和MySQL內部狀態已經不同步,那麼應該會爲您恢復到的服務器提供一個行爲良好的數據庫。

+0

不幸的是我不能將數據庫移動到另一臺服務器上,但是我使用BEFORE DELETE TRIGGER解決了這個問題。我想知道是否應該用MySQL提交錯誤報告? –

+0

您是否可以在不破壞現有數據庫的情況下在同一臺服務器上恢復它? –

+0

不,但是因爲我在開發中,所以在DB中只有測試數據,所以打破數據庫是沒有問題的。刪除數據庫並從頭開始是我在查看代碼後沒有發現任何問題後所做的第一件事,而且我的問題也一直存在。 –