나는 뭔가의 독창성을 명시 적으로 정의하는 것과 관련하여 질문이 있습니다. 이것은 복합 외래 키의 작성과 관련이 있습니다. 가능한 한 명확한 질문을하기 위해 아래 예제를 만들었습니다. 테스트의 편의를 위해 일부 데이터 삽입물을 포함 시켰습니다.복합 외래 키의 경우 /는 왜 기본 키가있는 열 조합에 대해 참조 된 테이블의 복합 UNIQUE 제약 조건입니까?
[Table1]
의 각 항목에는 고유 한 [Name]
이 있어야합니다.
CREATE TABLE [Table1]
(
[ID] INT IDENTITY NOT NULL PRIMARY KEY,
[Name] NVARCHAR(255) UNIQUE NOT NULL CHECK(LTRIM(RTRIM([Name])) <> '')
);
INSERT INTO [Table1]([Name])
VALUES
('Name 1'),
('Name 2'),
('Name 3'),
('Name 4'),
('Name 5'),
('Name 6'),
('Name 7')
각
[Table2]
의
[Value]
각
[Table1ID]
에 대해 고유해야합니다.
CREATE TABLE [Table2]
(
[ID] INT IDENTITY NOT NULL PRIMARY KEY,
[Table1ID] INT NOT NULL FOREIGN KEY REFERENCES [Table1]([ID]),
[Value] NVARCHAR(255) NOT NULL CHECK(LTRIM(RTRIM([Value])) <> ''),
--UNIQUE([ID], [Table1ID]),
UNIQUE([Table1ID], [Value])
);
INSERT INTO [Table2]([Table1ID], [Value])
VALUES
(1, 'Entry 1'),
(1, 'Entry 2'),
(1, 'Entry 3'),
(1, 'Entry 4'),
(3, 'Entry 5'),
(3, 'Entry 6'),
(3, 'Entry 7')
[Table3]
에 [Table1ID]
및 [Table2ID]
의 각 조합 [Table2]
에 일치하는 조합이 있어야합니다 (I가 복합 FOREIGN KEY
장소에있는 경우 [Table1ID]
및 [Table2ID]
에 대한 두 FOREIGN KEY
의이 불필요한 것이 겠지?)를.
CREATE TABLE [Table3]
(
[ID] INT IDENTITY NOT NULL,
[Table1ID] INT NOT NULL FOREIGN KEY REFERENCES [Table1]([ID]),
[Table2ID] INT NOT NULL FOREIGN KEY REFERENCES [Table2]([ID]),
FOREIGN KEY ([Table2ID], [Table1ID]) REFERENCES [Table2](ID, [Table1ID])
);
INSERT INTO [Table3]([Table2ID], [Table1ID])
VALUES
(5, 3)
는 [Table3]
복합 FOREIGN KEY
제약은 문제가된다. 주석 처리 된 UNIQUE
제약 조건이 [Table2]
에서 주석 처리되지 않은 경우 [Table3]
을 성공적으로 만들 수 있습니다. 그렇지 않은 경우 [Table3]
을 작성하면 "참조 된 테이블에 외부 키의 참조 컬럼리스트와 일치하는 기본 또는 후보 키가 없습니다"라는 메시지가 표시되지 않습니다.
내가 [Table2]
에 대한 [ID]
열이 PRIMARY KEY
이다 그러나 같은 키에 관해서 고유성에 대한 필요성을 이해하고 항상 고유 한 것, 왜 [Table2]
독특한 존재하지 [Table1ID]
열은 [Table2]
의 모든 [ID]
의 조합 [Table1ID]
을 방지 할 수 고유 한 것에서?
기본적으로 UNIQUE([ID], [Table1ID])
부분은 나에게 매우 불필요한 것, 그러나 [Table2]
에서 [Table1ID]
의 고유성이 명시 적으로 [Table3]
에 복합 외래 키의 생성을 허용하도록 SQL 서버의 순서를 정의해야합니다 보인다.
실제로 그런 경우입니까? 위와 같은 제약 조건은 불필요한 것처럼 보일 수 있지만 위의 내용을 허용하려면 필요합니까? 또는 나는 무엇인가 놓치고 있냐?
예, 고유성이 선언되어야 함을 발견했습니다. 나는 당신이 요구하는 것을 할 필요가있는 데이터 디자인에 의문을 가질 것이다. – Paparazzi
또 다시, 나는 물건을 시연하는 예로서 위를 합친 것입니다. 데이터 디자인 주석을 확장 할 수 있습니까? – Interminable
이걸 똑바로 세워 줘. Table2는 이미 Table1과 관계가 있습니다. 표 3에서 1과 2 사이의 관계를 직접 만들고 동시에 기존 관계 2를 존중합니다. 그 유형의 관계에 대한 합리적인 비즈니스 요구를 확장 할 수 있습니까? – Paparazzi