问题描述
我有两张桌子
CREATE TABLE [dbo].[Customer]
(
[SourceID] [int] NOT NULL,[ID_N] [bigint] NOT NULL,[RegionCode] [varchar](1) NOT NULL,[NSID] [int] NOT NULL,CONSTRAINT [Pk_Customer] PRIMARY KEY CLUSTERED
([RegionCode] ASC,[ID_N] ASC)
)
CREATE TABLE [dbo].[Order]
(
[Reference][nvarchar](50) NOT NULL,[SourceID] [int] NOT NULL,[ID_N] [nvarchar](50) NULL,[RegionCode] [varchar](1) NULL,[Customer_ID_N] [bigint] NULL,CONSTRAINT [PK_Order] PRIMARY KEY CLUSTERED
([Reference] ASC)
)
我想将 (CustomemrID_N,RegionCode) 作为对 Customer 表的外键引用。
Alter table [dbo].[Order]
ADD CONSTRAINT FK_Order_Customer FOREIGN KEY (Customer_ID_N,RegionCode)
REFERENCES[dbo].[Customer](ID_N,RegionCode)
但我收到此错误:
引用表“dbo.Customer”中没有与外键“FK_Order_Customer”中的引用列列表匹配的主键或候选键。
解决方法
您的尝试有很多问题...大多数是排版问题。
首先声明:
CREATE TABLE [dbo].[Customer](
[SourceID] [int] NOT NULL,[ID_N] [bigint] NOT NULL,[RegionCode] [varchar](1) NOT NULL,[NSID] [int] NOT NULL,CONSTRAINT [Pk_Customer] PRIMARY KEY CLUSTERED
([RegionCode] ASC,[ID_N] ASC)
语句末尾缺少右括号 ()
)。
然后是下一个语句:
CREATE TABLE [dbo].[Order](
[Reference][nvarchar](50) NOT NULL,[SourceID] [int] NOT NULL,[ID_N] [nvarchar](50) NULL,[RegionCode] [varchar](1) NULL,[Customer_ID_N] [bigint] NULL,CONSTRAINT [PK_Order] PRIMARY KEY CLUSTERED
([Reference] ASC)
这也是无效的,还缺少右括号。
你的最后一句话也是无效的:
Alter table [dbo].[Order]
ADD CONSTRAINT FK_Order_CustomerFOREIGN KEY ([Customer_ID_N],RegionCode)
REFERENCES[dbo].[Customer](ID_N,RegionCode)
CONSTRAINT FK_Order_CustomerFOREIGN KEY
应该是 CONSTRAINT FK_Order_Customer FOREIGN KEY
;注意 FK_Order_Customer
和 `FOREIGN 之间的空格。
一旦我们解决了这个问题,我们就会得到这样的结果:
CREATE TABLE [dbo].[Customer](
[SourceID] [int] NOT NULL,[ID_N] ASC))
GO
CREATE TABLE [dbo].[Order](
[Reference][nvarchar](50) NOT NULL,CONSTRAINT [PK_Order] PRIMARY KEY CLUSTERED
([Reference] ASC))
GO
Alter table [dbo].[Order]
ADD CONSTRAINT FK_Order_Customer FOREIGN KEY ([Customer_ID_N],RegionCode)
注意,当你运行它时,你会得到上面的错误。这是因为您的 PK 被定义为 [RegionCode] ASC,[ID_N] ASC
not ID_N,RegionCode
。所以让我们解决这个问题,因为交换外键......
Alter table [dbo].[Order]
ADD CONSTRAINT FK_Order_Customer FOREIGN KEY (RegionCode,[Customer_ID_N])
REFERENCES[dbo].[Customer](RegionCode,ID_N)
现在它可以工作了。
解决印刷错误,然后阅读错误;它告诉你问题所在。