Sql server 引用的表中没有主键或候选键

Sql server 引用的表中没有主键或候选键,sql-server,foreign-keys,Sql Server,Foreign Keys,我有两张桌子: 表1 c_ID float-PK 字段1 字段2 字段3 p_ID[唯一标识符] 及 表2 p_ID nvarchar s_ID浮动 其中p_ID和s_ID都是主键的一部分 我尝试在表1上创建外键: ALTER TABLE Table1 ADD CONSTRAINT FK_Table1_Table2 FOREIGN KEY (p_ID) REFERENCES Table2(p_ID) 我犯了一个错误: 引用的表中没有主键或候选键 与外键中的引用列列表匹配的“db

我有两张桌子:

表1


c_ID float-PK
字段1
字段2
字段3
p_ID[唯一标识符]

表2


p_ID nvarchar
s_ID浮动

其中p_ID和s_ID都是主键的一部分

我尝试在表1上创建外键:

ALTER TABLE Table1
ADD CONSTRAINT FK_Table1_Table2 FOREIGN KEY (p_ID) 
    REFERENCES Table2(p_ID) 
我犯了一个错误:

引用的表中没有主键或候选键 与外键中的引用列列表匹配的“dbo.Table2” “FK_表1_表2”


我得到这个错误是因为
p\u ID
的数据类型是uniqueidentifier,而在表2中
p\u ID
是nvarchar?有解决方法吗?

您只需使用包含PK中相同列的FK即可

create table ParentTest (
SomeNumber int,
Name varchar(25),
PRIMARY KEY (SomeNumber, Name)
)


create table ChildTest (
SomeValue varchar(25),
SomeNumber int,
Name varchar(25),
FOREIGN KEY (SomeNumber, Name) references ParentTest (SomeNumber, Name)
)

嘘,我希望这些不是你真正的列名……它们太可怕了。错误是因为Table2有一个复合密钥,您试图为该密钥的一部分建立外键。还有,为什么一个表有一个guid,然后作为varchar存储在另一个表中?这意味着每次更新时都会有一个隐式转换。如果该值是guid,则应始终这样存储。当然,它们不是真实的列名!此外,我没有创建表,因此无法控制数据类型。有没有关于如何解决这个问题的建议?就像我说的,问题是您试图为复合键的一部分创建一个外键。你不能那样做。必须有某种东西表明列是唯一的,可以是主键,也可以是唯一约束。我猜表2中的p_ID不是唯一的,因此复合key.True。表2中的p_ID不是唯一的。我所说的只有与s_IDRight相结合才是独一无二的。不能将其用作外键,因为它只是该表主键的一部分。