我有以下T-SQL来创建3个SQL表:
create table dbo.Posts
(
Id int identity not null
constraint PK_Posts_Id primary key clustered (Id),
Active bit not null
constraint DF_Posts_Active default (0)
);
create table dbo.PostsLocalized
(
Id int not null,
Culture int not null
constraint CK_PostsLocalized_Culture check ([Culture] in ('1', '2', '3')),
[Text] nvarchar (200) not null,
constraint PK_PostsLocalized_Id_Culture primary key clustered (Id, Culture)
);
create table dbo.Tags
(
Id int identity not null
constraint PK_Tags_Id primary key clustered (Id),
Name nvarchar not null
);
create table dbo.PostsLocalized_Tags
(
PostLocalizedId int not null,
TagId int not null,
constraint PK_PostsLocalized_Tags_Post_PostLocalizedId_TagId primary key clustered (PostLocalizedId, TagId)
);
然后我添加了以下约束:
alter table dbo.PostsLocalized
add constraint FK_PostsLocalized_Id foreign key (Id) references dbo.Posts(Id) on delete cascade on update cascade;
alter table dbo.PostsLocalized_Tags
add constraint FK_PostsLocalized_Tags_PostLocalizedId foreign key (PostLocalizedId) references PostsLocalized(Id) on delete cascade on update cascade,
constraint FK_PostsLocalized_Tags_TagId foreign key (TagId) references Tags(Id) on delete cascade on update cascade;
但是我收到以下错误:
There are no primary or candidate keys in the referenced table 'PostsLocalized' that match the referencing column list in the foreign key 'FK_PostsLocalized_Tags_PostLocalizedId'.
我该如何解决这个问题?
谢谢你, 米格尔
答案 0 :(得分:2)
SQL Server要求外键引用是主键或唯一键。外键引用必须是 all 构成主/唯一键的列。 documentation说:
在外键引用中,在两个表之间创建链接 包含一个表的主键值的一列或多列 由另一个表中的一列或多列引用。这一栏 成为第二个表中的外键。
FOREIGN KEY约束不必仅链接到PRIMARY 另一个表中的KEY约束;它也可以定义为参考 另一个表中的UNIQUE约束的列。一把外国钥匙 约束可以包含空值;但是,如果有任何一列 复合FOREIGN KEY约束包含空值,验证 将跳过构成FOREIGN KEY约束的所有值。要做 确保复合FOREIGN KEY约束的所有值都是 已验证,请在所有参与列上指定NOT NULL。
PostsLocalized
中的主键包含culture
列,因此您需要将其添加到外键引用中。
答案 1 :(得分:0)
PostsLocalized
表上的PK很复杂,包含两列 - id
和culture
,您尝试仅在其中一列上创建FK,这是不可能的。
您必须在Culture
上添加PostsLocalized_Tags
列并在外键中使用它们,或在Culture
上的PK中删除PostLocalized