2 테이블, 고객 및 제휴사가 있습니다. customers.email 및 affiliates.email이 독점적인지 확인해야합니다. 즉, 한 사람이 고객이 될 수도 있고 계열사가 될 수도 없습니다. 그것은 기본적으로 외래 키의 반대입니다. 이것을 할 수있는 방법이 있습니까?mysql 외부 키의 반대
답변
당신은 이메일을 저장하고 이메일에 고유의 구속이 테이블을 사용하고, 고객과 제휴사에서 해당 테이블을 참조 할 수 있습니다.
(여전히 동일한 키를 참조하는 레코드가 2 개가 없음을 보장해야 함)
삽입 전에 및 업데이트 전에 트리거를 사용하여 전자 메일이 존재하지 않는지 확인할 수 있습니다.
또는이 유효성 검사를 응용 프로그램 논리에 그대로 둘 수 있습니다 - 데이터베이스가 아닌 응용 프로그램 논리에 그대로 둘 수 있습니다.
키를 사용할 수 없지만 두 개의 테이블을 사용하지 않아야하는 것처럼 들립니다. 대신 고객/제휴사 데이터 (이 표에서 고유해야 함)와 유형 (고객/제휴사)이있는 다른 표가있는 하나의 표를 가질 수 있습니다.
CREATE TABLE People (
pplid,
pplEmail,
ptid,
UNIQUE KEY (pplEmail)
)
CREATE TABLE PeopleType (
ptid,
ptType
)
INSERT INTO PeopleType VALUES (1, 'affiliates'), (2, 'customers');
, 당신은 또한 열의를 할 수 : 고객 및 제휴사에 대한 마스터가 될 것이다, 새 테이블을 만듭니다 고객은 0이고 제휴사는 1 인 테이블. –
@ Fls'Zen 다소 차이가 있습니다 (예를 들어'enum '을 사용할 수도 있습니다). 당신이 원하는 정상적인 방법에 달려 있습니다 :) –
기본적으로 고객과 제휴사를 하나의 테이블 (사람들)로 결합했습니다. 문제는 고객과 계열사가 서로 다른 필드를 가지고 있기 때문에 이것이 실제로 나에게 도움이되지 않는다는 것입니다. – user617123
다음을 시도해보십시오. 그것은 확실히 정규화 아니지만
CREATE TABLE party
(
id int not null auto_increment primary key ,
party_type enum('customer','affiliate') not null,
email varchar(100),
UNIQUE (id,party_type)
);
--Then
CREATE TABLE customer
(
....
party_id INT NOT NULL,
party_type enum('customer') NOT NULL DEFAULT 'customer',
PRIMARY KEY (party_id,party_type)
FOREIGN KEY (party_id,party_type) REFERENCES party(id,party_type)
);
CREATE TABLE affiliates
(
....
party_id INT NOT NULL,
party_type enum('affiliate') NOT NULL DEFAULT 'affiliate',
PRIMARY KEY (party_id,party_type)
FOREIGN KEY (party_id,party_type) REFERENCES party(id,party_type)
)
-- enum is used because mysql still doesn't have CHECK constraints
각 당사자는 하나 개의 유형이 될 수있는이 방법은
- 1. PHP MYSQL 반대 선택
- 2. MySQL 키의 고유성 보장
- 3. MySQL DATE_FORMAT 반대? . 다음과 같은
- 4. MySQL 외부 키 쿼리
- 5. 외부 키의 색인이 결합 조회에서 선택되지 않았습니다.
- 6. MySQL 중복되지 않는 키의 기본 키가
- 7. MySQL : 자동 증가 기본 키의 순서 변경?
- 8. MYSQL 자동 증가 기본 키의 실제 문제
- 9. 이 MySQL tinyblob 키의 길이는 얼마입니까?
- 10. PHP의 MYSQL의 반대 '와'절
- 11. 기존의 MySQL 외래 키의 계단식 동작을 변경하는 것이 가능합니까?
- 12. PHP는 반대
- 13. 이진수 반대
- 14. LSGetApplicationForItem의 반대
- 15. __add__의 반대?
- 16. mysql 외부 액세스
- 17. Entity Framework nvarchar 외부 키의 대/소문자 구분
- 18. 제출 된 외부 키의 유효성을 검사하는 우아한 방법
- 19. mysql을 사용하여 반대 결과 찾기
- 20. MySQL의 반대 GROUP BY 결과
- 21. 외부 mysql 데이터베이스를 읽는 방법
- 22. mysql 덤프 명령 줄 외부
- 23. 디스플레이 반대 : td에 없음
- 24. 아포스트로피하고있는 NSString에 반대 아포스트로피
- 25. Django는 반대 관계를 말합니다.
- 26. 이유 및 데이터베이스 반대
- 27. BitConverter.ToString에 대한 반대 방법?
- 28. PHP에서 mktime()의 반대?
- 29. 반대 PHP에서 positiong 사용
- 30. JQuery draggable - connectToSortable의 반대
첫 번째 해결 방법은 customers 테이블과 affiliates 테이블이 전자 메일 테이블의 단일 레코드를 참조하는 것을 어떻게 방지합니까? – octern
예, 옥탄에 동의합니다. 그러나 대답의 두 번째 부분은 합법적입니다. 응용 프로그램 논리 (새 레코드를 삽입하기 전에 검사를 실행하는)로 남겨 두는 것이 가장 쉬운 방법 인 것 같습니다. 답을 수정하면 받아 들일 것입니다. – user617123
@ user617123 메모를 촬영하고 답변을 수정했습니다. –