2013-09-26 4 views
2

복합 키를 기본 키로 사용하는 테이블이 있습니다. "양방향"합성 키 만들기

CREATE TABLE FOO(
    BAR1 INT, 
    BAR2 INT, 
PRIMARY KEY (BAR1, BAR2)) 

는 BAR1 및 BAR2는 FK : 그것의 생성과 같은 다른 테이블들과 나는 둘 다 그 키가 동시에 존재하는 내 FOO 테이블에 0 또는 1 튜플 항상이 있는지 확인하고 싶습니다. Basicaly 나는처럼되고 동시에 그것을 좋아하는 것 : 키가 모두 그들 각각은 고유 할 수 있도록 다른 키와 시간의 임의의 수를 페어링 할 수 있어야합니다 동시에

PRIMARY KEY (BAR2, BAR1) 

합니다. 내가

INSERT INTO FOO VALUES (1,2); 

했을 때

그래서 스키마는

INSERT INTO FOO VALUES (2,1); 

MySQL의에서이 문제를 해결하는 좋은 방법은 무엇입니까 허용 것인가?

답변

2

가능한 해결책은 방아쇠를 사용하는 것입니다.

create trigger bi_foo before insert on foo 
for each row 
begin 
    if exists(select 1 from foo where bar1 = NEW.bar2 and bar2 = NEW.bar1) 
    then 
    signal sqlstate '50000' set message_text="Oops"; 
    end if; 
end 

이 작동합니다 :

insert into foo values (1, 2), (3, 4), (5, 6); 
insert into foo values (3, 2), (3, 5), (1, 6); 

이 실패합니다 : 물론

mysql> insert into foo values (2, 1); 
ERROR 1644 (50000): Oops 
+0

또한 비슷한 확인을하는 UPDATE 트리거가 필요합니다. – sqlvogel

+0

@sqlvogel, bar1 + bar2가 기본 키로 간주되므로 애플리케이션에서이 테이블을 업데이트하는지 여부는 OP에서 분명하지 않지만 여기에 동의합니다. 업데이트가 발생하면 업데이트 트리거가 필요할 것입니다. –

+0

이것은 이론적 인 수준에서 합리적인 것처럼 보입니다. 제안 된 트리거를 만들려고하면 구문 오류가 발생합니다. @sqlvogel : 분명히하기 위해, 그렇습니다. appplication은이 테이블을 업데이트합니다. –

2

귀하의 요구 사항을 잘 이해하지 못했지만 다음 중 하나를 원할 것입니다.

  1. BAR1/BAR2 값의 하나의 가능한 페어링이 FOO 존재할 수 있는지 확인합니다

    CREATE TABLE FOO(
        BAR1 INT, 
        BAR2 INT, 
    CHECK (BAR1<=BAR2), 
    PRIMARY KEY (BAR1, BAR2)); 
    
  2. 두 짝이 항상 존재해야하는지 확인하십시오

    CREATE TABLE FOO(
        BAR1 INT, 
        BAR2 INT, 
    FOREIGN KEY (BAR2, BAR1) REFERENCES FOO (BAR1, BAR2), 
    PRIMARY KEY (BAR1, BAR2)); 
    
+0

을! 내가 요구 한 것은 당신의 첫 번째 대답이었습니다. –

+0

시도해 보셨습니까? –

+3

MySQL에서 "CHECK 절은 구문 분석되지만 모든 저장소 엔진에서 무시됩니다"http://dev.mysql.com/doc/refman/5.7/en/create-table.html – rsanchez