2010-06-29 2 views
1

테이블의 열에 다른 테이블에 나열된 제한된 도메인이 있어야합니다. 일반적으로이 작업을 수행 할 것입니다 :SQL : 외래 키를 사용하지 않는 다른 테이블의 열 값과 열의 값을 비교하는 방법이 있습니까?

ALTER TABLE Table1 
ADD CONSTRAINT FK_Especialidade FOREIGN KEY (column1) 
REFERENCES Table2 

그러나 "column1"이 참조해야하는 값은 Table2의 기본 키가 아니어야합니다. 어떤 제안?

+1

외래 키 제약 조건에서 참조 할 기본 키가 아니어도되며 고유 인덱스 여야합니다. 그러나 당신이 그것을 고유하지 않기를 원한다면, 방아쇠가 갈 길은 있습니다. 사람들은 이미 그것에 대답했습니다. 이것이 바로 답이 아니라 주석입니다 :-) – paxdiablo

답변

1

당신은 트리거 당신이

CREATE TRIGGER MyTrigger ON Table1 FOR INSERT, UPDATE 
AS 
    IF UPDATE(column1) 
    BEGIN 
    IF NOT EXIST (SELECT column2 FROM Table2 WHERE column2 = column1) 
     RAISERROR ('Invalid column1 value.', 16, 1) 
    END 
    END 

당신이 적어도 표 2에 2 열에서 인덱스를 가지고 있는지 확인하십시오 (이 내 머리 위로 떨어져이다, 구문이 ... 잘되지 않을 수도 있습니다)을 사용할 수 있습니다 가능한 빨리 트리거를 실행하십시오!

0

트리거는 어떨까요?

0

외래 키는 기본 키가 아닌 대상 테이블의 모든 UNIQUE 제약 조건을 참조 할 수 있습니다.

CREATE TABLE foo (
    foo_id INT PRIMARY KEY, 
    some_attribute INT, 
    UNIQUE KEY (some_attribute) 
); 

CREATE TABLE bar (
    bar_id INT PRIMARY KEY, 
    some_attribute INT, 
    FOREIGN KEY (some_attribute) REFERENCES foo (some_attribute) 
); 
0

당신은 지금 여기에 'SQL'태그를 추가 몇 가지 유효한 전체 SQL-92의 한 : 물론

ALTER TABLE Table1 
ADD CONSTRAINT ck_Especialidade 
CHECK (
     EXISTS (
       SELECT * 
       FROM Table2 
       WHERE Table2.column1 = Table1.column1 
      ) 
    ); 

, 모든 SQL 제품이 전체 SQL-92 기능을 구현 (예 : SQL 서버는 ...)하지만 해결 방법이있을 수 있습니다 (예 : 사용자 정의 함수 사용). 여하튼, 왜 바퀴를 다시 발명합니까?

+0

실제로 어떤 RDBMS도 구현하고 있습니까 이? –

+0

Access Database Engine을 사용하여 테스트했는데, 이것이 내가 잘 모르는 RDBMS라고 생각하든간에. 내가 알고있는 SQL 제품은 SQL Server, Oracle, Mimer 및 Postgre를 지원하지 않습니다. – onedaywhen

+0

그래서 제약 조건이 Table1에 있어도 Table2에서 제약 조건을 위반하는지 여부를 확인합니다. –

관련 문제