2010-02-04 4 views
2

흥미로운 상황이 있습니다. a.name (하위 테이블)에서 b.name (상위 테이블)까지 외래 키가 있습니다. b.name에는 고유 제한 조건이 없으므로 중복 값이 ​​들어있을 수 있습니다. 내가 b.name 두 번에 이름이 '밥'을 넣어, 다음 a.name에 넣어 경우MySQL : 두 부모를 참조하는 외래 키

, 나는 더 이상 삭제하거나 테이블 B의 '밥'의 예 중 하나를 업데이트 할 수 있습니다. 두 경우 모두 테이블 b의 행을 삭제/업데이트하면 a.name과 b.name을 연결하는 FKey가 실패합니다.

이제는 이해가되지만 이 아니고 다른 인스턴스 인 'bob'이 테이블 b에만있는 경우에만 FKey에게 실패 할 것이라고 말하고 싶습니다. 따라서 b.name에 'bob'이라는 인스턴스가 여러 개있는 경우 마지막 인스턴스를 제외한 모든 인스턴스를 변경/삭제할 수 있습니다.

[참고 명백한을하고 그것이 내가 작성하지 않은 응용 프로그램에서 '정의되지 않은 동작'의 원인이되므로 b.name에 고유 제한 조건이 작동하지 않습니다 및 추가]

어떤 아이디어? 스트레이트 http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

...Additionally, MySQL and InnoDB require that the referenced columns be indexed for performance. However, the system does not enforce a requirement that the referenced columns be UNIQUE or be declared NOT NULL.The handling of foreign key references to nonunique keys or keys that contain NULL values is not well defined for operations such as UPDATE or DELETE CASCADE. You are advised to use foreign keys that reference only UNIQUE and NOT NULL keys....

에서

답변

2

그래서, 당신의 FKS 고유 값에 연결 또는 누가 어떤 일이 말의 유지?

+0

나는 그것을 놓쳤다. 감사. – dordal

0

외래 키가 유일한 엔티티를 참조해야합니다. 외래 키를 사용하는 대신 BEFORE 트리거에서 모든 로직을 구현해야합니다.

0

b.name에 'bob'을 두 번 입력하면 더 이상 테이블 b의 행으로 고유하게 식별되지 않습니다.

b.name에 중복 값이있을 수있는 경우 테이블 A는 더 나은 키 (대리 키 또는 복합 키)를 사용해야합니다.

업데이트/삭제 문제 외에도 SELECT * FROM a join b on a.name = b.name과 같은 쿼리는 예상대로 작동하지 않습니다. 상황이 훨씬 최적의, 또는 추천에서하지만

+0

예, 고마워요. 내 큰 문제는 우리가 통합하는 응용 프로그램이 제 3 자에 의해 작성되고 DB 스키마를 정의한다는 것입니다. 그런 다음 DB에 테이블을 추가하면 이것이 우리가 혼란에 빠지게됩니다. 네, 이상하지 않다는 것을 압니다. :-) – dordal

+0

거의 모든 프로그래밍 작업이 이상적이지 않습니다. P – Seth

0

,이 같은 외래 키 검사 주위를 얻을 수 있습니다 : 당신이에 설명 된대로

SET FOREIGN_KEY_CHECKS = 0; 
// do your dirty work here 
SET FOREIGN_KEY_CHECKS = 1; 

당신은 당신의 코드에서 참조 무결성을 유지해야합니다 당신의 게시하다.

관련 문제