引用表中没有PK。为什么?

时间:2014-03-19 21:09:24

标签: sql tsql

我有以下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'.

我该如何解决这个问题?

谢谢你, 米格尔

2 个答案:

答案 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很复杂,包含两列 - idculture,您尝试仅在其中一列上创建FK,这是不可能的。

您必须在Culture上添加PostsLocalized_Tags列并在外键中使用它们,或在Culture上的PK中删除PostLocalized