저는 개인적인 프로젝트를하고 있습니다. 처음으로 평생 동안 처음으로 정상화 된 데이터베이스를 만들려고합니다. 여기에 내 문제에 관련된 테이블이 있습니다 :mysql 외래 키 제약 조건에 어떤 문제가 있습니까?
CREATE TABLE `reoccurrences` (
`name` varchar(15) NOT NULL DEFAULT '',
`username` varchar(31) NOT NULL DEFAULT '',
`amount` float(7,2) NOT NULL DEFAULT '0.00',
`action` varchar(15) NOT NULL DEFAULT '',
`frequency` varchar(15) NOT NULL DEFAULT '',
PRIMARY KEY (`name`,`username`),
KEY `fk_reoccurrences_user` (`username`),
KEY `fk_reoccurrences_action` (`action`),
KEY `fk_reoccurrences_frequency` (`frequency`),
CONSTRAINT `fk_reoccurrences_action` FOREIGN KEY (`action`) REFERENCES `actions` (`name`),
CONSTRAINT `fk_reoccurrences_frequency` FOREIGN KEY (`frequency`) REFERENCES `frequencies` (`name`),
CONSTRAINT `fk_reoccurrences_user` FOREIGN KEY (`username`) REFERENCES `users` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `days` (
`reoccurrence` varchar(15) NOT NULL,
`username` varchar(31) NOT NULL DEFAULT '',
`day` tinyint(2) NOT NULL,
PRIMARY KEY (`reoccurrence`,`username`,`day`),
KEY `fk_days_reoccurrence2` (`username`),
CONSTRAINT `fk_days_reoccurrence` FOREIGN KEY (`reoccurrence`) REFERENCES `reoccurrences` (`name`),
CONSTRAINT `fk_days_reoccurrence2` FOREIGN KEY (`username`) REFERENCES `reoccurrences` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
참고,이 두 테이블 사이의 주요 문제는 (나는) 믿습니다. 다른 여러 관련 테이블이 있지만 내가이 게시물을 나열하기 시작하면이 게시물은 매우 길어질 것입니다. 전체 데이터 구조를보고 싶다면 내 프로젝트를 github에서 여기에서 볼 수 있습니다 : https://github.com/dallascaley/finance (내 github 추가 정보에서 욕설/상식에 대해 사과합니다. 공개적으로 볼 목적이 아닙니다.)
문제는 내가이 테이블에 데이터를 추가하기 시작할 때 발생합니다. 여기에 내가 가지고있는 데이터가있다 :
reoccurrences:
name, username, amount, action, frequency
Pay , dallas , 2500 , credit, bi-weekly
Rent, dallas , 1400 , debit , monthly
days:
reoccurrence, username, day
Rent , dallas , 1
나는 하루 또는 유급으로 나열된 며칠이 없다는 사실을 무시한다. 어떤 이유로 테이블이이 상태에있을 때 Reoccurrence 테이블에서 Pay 레코드를 삭제할 수 없습니다. 나는이 프로그램을 실행할 때 :
DELETE FROM reoccurrences WHERE `name` = 'Pay' AND `username` = 'dallas';
나는 다음과 같은 오류 얻을 :
Cannot delete or update a parent row: a foreign key constraint fails (`test`.`days`, CONSTRAINT `fk_days_reoccurrence2` FOREIGN KEY (`username`) REFERENCES `reoccurrences` (`username`))
가 어떻게이 문제를 해결하기 위해 내 테이블 구조를 변경할 수 있습니까?
감사합니다. 나는 적절한 데이터 구조 (HauteLook 외에도 데이터베이스 근처에 두지 않았 음)를 적용한 회사에서 일한 적이없는 소프트웨어 개발의 10 년을 믿을 수 없다. –
MySQL을 많이 사용하지 않지만 'day' 테이블에서'reoccurrence'까지의 원래 외래 키 제약 조건은 좋지 않았습니다. 그들은 각각'name (1) -> reoccurrence (n)'과'username (1) -> username (n)'컬럼에서'reoccurrence'와'days' 사이에 1 : 'reoccurrence'는'name' 또는'username' 중 하나의 인스턴스를 시행하지 않았습니다. 그래서'reoccurrence'에서 삭제를 시도했을 때'username '에 대한 참조 제한은'dallas'인스턴스가 2 개 였지만'days'가'username'' dallas를 참조했기 때문에 삭제를 막습니다. – Sentinel