2012-05-23 4 views
1

두 개의 테이블 A와 B가 있다고합시다.
A에는 id, a1, a2 필드가 있습니다.
B는 id, b1, b2 필드를 포함합니다.SQL Server에서 이러한 종류의 제약 조건을 만드는 방법은 무엇입니까?

id 필드를 기반으로 테이블 A에서 B까지 일대일 관계를 수행합니다.

이제 b1, b2 및 a1을 기반으로 중복 레코드를 삽입하지 못하게하는 테이블 b에 대한 고유 제한 조건을 생성한다고 가정 해 보겠습니다. 그게 가능하니?

답변

3

Ba1 사본이 있어야 제약 조건을 적용 할 수 있습니다. 이 정보를 사용자에게 표시하지 않으려면 B 열 + a1을 모두 포함하는 테이블 (예 : _B)을 만든 다음 B이라는 숨겨진 뷰 (적절한 삽입 트리거를 사용하여 a1 채우기)를 만듭니다. 이 열.

또한 ida1 이상 A의 수 퍼키를 작성하고이 복사 된 열이 제대로 A의 해당 값과 일치하는지 확인하기 위해이 열 둘 이상 B에서 (아마도 ON UPDATE CASCADE와) 외래 키 제약 조건을 사용해야합니다.

그런 다음 외부 키가 유일한 것인지 아니면 "올바른"키 (계속 id 이상)를 계속 유지할지 여부는 미각의 문제입니다.


예 :

CREATE TABLE dbo.A (ID int not null,a1 int not null,a2 int not null, 
    constraint PK_A PRIMARY KEY (id), 
    constraint UQ_A_a1_check UNIQUE (id,a1) 
) 
CREATE TABLE dbo._B (ID int not null,a1 int not null,b1 int not null,b2 int not null, 
    constraint PK_B PRIMARY KEY (a1,b1,b2), 
    constraint FK_B_A FOREIGN KEY (id) references A (id), 
    constraint DRI_B_A_a1_check FOREIGN KEY (id,a1) references A (id,a1) on update cascade 
) 
GO 
CREATE VIEW dbo.B 
WITH SCHEMABINDING 
AS 
    select id,b1,b2 from dbo._B 
GO 
CREATE TRIGGER T_B_I on dbo.B instead of insert 
AS 
    INSERT INTO dbo._B (id,a1,b1,b2) 
    SELECT i.id,a.a1,i.b1,i.b2 
    FROM 
     inserted i 
      inner join 
     dbo.A a 
      on 
      i.id = a.id 
GO 
+0

+1 . 'DRI_B_A_a1_check'가 추가 된 후에'FK_B_A' 제약이 필요합니까? –

+0

세 번째 단락을보십시오 - 제가 말했듯이, 그것은 맛의 문제입니다. 그것은 진정한 관계를 "문서화"합니다 ('DRI_'는 진정한 외래 키로 행동하는 것보다 차라리 DRI 목적을위한 충분한 단서가됩니다) –

+0

테이블 B에 a1을 추가하는 것과 같은 소리가납니다. 나를 위해 훨씬 간단한 해결책이 될 것입니다. 고맙게도 변경되지 않는 값이므로 헤더 및 세부 테이블이 일관성없는 상태가되는 것을 걱정하지 않고이 작업을 수행 할 수 있어야합니다. –

0

하나의 솔루션은 테이블 A에 중복 값에 대한 기능 테스트를 만들고 테이블 B에 기능을 참조하는 점검 제한 조건을 추가 할 수

관련 문제