두 개의 테이블 A와 B가 있다고합시다.
A에는 id, a1, a2 필드가 있습니다.
B는 id, b1, b2 필드를 포함합니다.SQL Server에서 이러한 종류의 제약 조건을 만드는 방법은 무엇입니까?
id 필드를 기반으로 테이블 A에서 B까지 일대일 관계를 수행합니다.
이제 b1, b2 및 a1을 기반으로 중복 레코드를 삽입하지 못하게하는 테이블 b에 대한 고유 제한 조건을 생성한다고 가정 해 보겠습니다. 그게 가능하니?
두 개의 테이블 A와 B가 있다고합시다.
A에는 id, a1, a2 필드가 있습니다.
B는 id, b1, b2 필드를 포함합니다.SQL Server에서 이러한 종류의 제약 조건을 만드는 방법은 무엇입니까?
id 필드를 기반으로 테이블 A에서 B까지 일대일 관계를 수행합니다.
이제 b1, b2 및 a1을 기반으로 중복 레코드를 삽입하지 못하게하는 테이블 b에 대한 고유 제한 조건을 생성한다고 가정 해 보겠습니다. 그게 가능하니?
B
에 a1
사본이 있어야 제약 조건을 적용 할 수 있습니다. 이 정보를 사용자에게 표시하지 않으려면 B
열 + a1
을 모두 포함하는 테이블 (예 : _B
)을 만든 다음 B
이라는 숨겨진 뷰 (적절한 삽입 트리거를 사용하여 a1
채우기)를 만듭니다. 이 열.
또한 id
및 a1
이상 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
하나의 솔루션은 테이블 A에 중복 값에 대한 기능 테스트를 만들고 테이블 B에 기능을 참조하는 점검 제한 조건을 추가 할 수
+1 . 'DRI_B_A_a1_check'가 추가 된 후에'FK_B_A' 제약이 필요합니까? –
세 번째 단락을보십시오 - 제가 말했듯이, 그것은 맛의 문제입니다. 그것은 진정한 관계를 "문서화"합니다 ('DRI_'는 진정한 외래 키로 행동하는 것보다 차라리 DRI 목적을위한 충분한 단서가됩니다) –
테이블 B에 a1을 추가하는 것과 같은 소리가납니다. 나를 위해 훨씬 간단한 해결책이 될 것입니다. 고맙게도 변경되지 않는 값이므로 헤더 및 세부 테이블이 일관성없는 상태가되는 것을 걱정하지 않고이 작업을 수행 할 수 있어야합니다. –