2011-09-07 2 views
2

MySQL 데이터베이스를 사용하여 여러 웹 사이트에서 사용할 수 있도록 코드 스 니펫을 저장하는 프로젝트를 진행하고 있습니다. 각 콘텐츠 스 니펫별로 수정 내역 테이블을 유지하며 스 니펫이 업데이트 될 때마다 레코드를 추가합니다. 때로는 스 니펫을 완전히 삭제하고 관련된 편집 내역을 삭제하는 것이 바람직합니다. DB를 설정할 때 ON DELETE CASCADE와 외래 키 관계를 설정하여 스 니펫을 삭제하면 자동으로 내역이 삭제됩니다. 당신은 DB의 그래픽 표현을보고 싶다면MySQL FK 관계에도 불구하고 삭제를 허용하지 않습니다. DELETE CASCADE 세트

/*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; 

: 나는 관계뿐만 아니라 DB를 만드는 데 사용하는 코드를 여기에

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))

한다 : 그러나, 나는 다음과 같은 오류를 얻고있다 , 당신은 SchemaBank에 그것을 볼 수있다. SchemaBank 계정이없는 사용자는 다음과 같습니다. UCR Schema

아이디어가 있으십니까?

+0

Schemabank는 로그인이 필요하므로 쓸모가 없습니다. – Johan

+0

나는 너를 위해 png를 추가했다. –

+0

왜 이렇게하는지 잘 모르겠습니다. 'snippet_edit_history'를 모두 지우지 만 그 문제를 해결하는 AFTER DELETE TRIGGER의 형태로 해결 방법을 줄 수 있습니다. – Johan

답변

0

코드가 맞습니다.

실용적인 경우 해당 데이터베이스를 덤프하고 다른 서버에 테스트로 복원하십시오. INNODB와 MySQL 내부 상태가 동기화되지 않는다면 복원 할 서버에서 잘 작동하는 데이터베이스를 제공해야합니다.

+0

불행히도 DB를 다른 서버로 옮길 수는 없겠지만, 먼저 BEGORE DELETE TRIGGER를 사용하여이 문제를 해결했습니다. 아마도 MySQL에 버그 리포트를 제출해야하는지 궁금합니다. –

+0

기존 데이터베이스를 손상시키지 않고 동일한 서버에서 복원 할 수 있습니까? –

+0

아니요,하지만 개발 중이므로 DB에 테스트 데이터 만 있으므로 DB를 손상시키지 않아도됩니다. 데이터베이스를 삭제하고 처음부터 시작한 것은 코드를 살펴보고 문제를 찾지 못한 첫 번째 작업이었습니다. 문제가 계속 발생했습니다. –

관련 문제