具有相同主键的多个外键

时间:2017-08-24 05:15:52

标签: sql sql-server

我使用Microsoft SQL Server 2014 Express作为数据库服务器。

我有以下两个表,我想在其中创建PK-FK关系。

CREATE TABLE [dbo].[Account]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [ACCOUNTNAME] [nvarchar](max) NOT NULL,
    [ACCOUNTTYPE] [int] NOT NULL,
    [CREATE_TIMESTAMP] [datetime] NOT NULL,
    [LAST_EDIT_TIMESTAMP] [datetime] NOT NULL,
    [OPENING_BALANCE] [decimal](18, 2) NOT NULL DEFAULT ((0)),
    [OPENING_BALANCE_TYPE] [nvarchar](50) NULL,

    CONSTRAINT [PK_dbo.Account] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

CREATE TABLE [dbo].[Voucher]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [VOUCHERTYPE] [nvarchar](50) NOT NULL,
    [VOUCHERNO] [int] NOT NULL,
    [DATE] [datetime] NOT NULL,
    [AMOUNT] [decimal](18, 2) NOT NULL,
    [DRPARTY] [int] NOT NULL,
    [CRPARTY] [int] NOT NULL,
    [DETAILS] [nvarchar](50) NOT NULL,
    [ORIGIN] [nvarchar](50) NULL,
    [ORIGINID] [int] NOT NULL,
    [ORIGINDETAILS] [nvarchar](max) NULL,
    [CREATE_TIMESTAMP] [datetime] NOT NULL DEFAULT ('1900-01-01T00:00:00.000'),
    [LAST_EDIT_TIMESTAMP] [datetime] NOT NULL DEFAULT ('1900-01-01T00:00:00.000'),
    [TRANSACTION_TYPE] [nvarchar](50) NULL,

    CONSTRAINT [PK_dbo.Voucher] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

这是我通过Microsoft SQL Server Management Studio创建FK关系时遇到的错误。两个表都是空的。

  

'帐户'表已成功保存   '凭证'表 - 无法创建关系'FK_Voucher_Account1'。 ALTER TABLE语句与FOREIGN KEY约束“FK_Voucher_Account1”冲突。冲突发生在数据库“SKUMAR”,表“dbo.Account”,列“ID”

我想创建Account.ID -> Voucher.DRPARTYAccount.ID -> Voucher.CRPARTY之间的关系,但我无法创建第二个FK关系。

我可以知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

由于Voucher(CRPARTY)列和Account(Id)列之间的数据不匹配,外键错误可能会发生冲突。 CRPARTY表中可用的行必须位于“帐户”表中。

使用以下查询验证。

SELECT * FROM Voucher WHERE CRPARTY NOT IN (SELECT Id FROM Account);

我能够创造2个FK到1个PK。 http://rextester.com/WMAT80057

答案 1 :(得分:1)

您可以删除表之间的FK关系,并使用此脚本创建它们。希望您的表格没有不匹配的数据。

ALTER TABLE [dbo]. [Voucher] WITH CHECK ADD CONSTRAINT  [FK_ACCOUNT_ID_VOUCHER_DRPARTY] FOREIGN KEY ([DRPARTY]) REFERENCES [dbo]. [Account]([ID])

GO

ALTER TABLE [dbo]. [Voucher] CHECK  CONSTRAINT  [FK_ACCOUNT_ID_VOUCHER_DRPARTY] 
GO

ALTER TABLE [dbo]. [Voucher] WITH CHECK ADD CONSTRAINT  [FK_ACCOUNT_ID_VOUCHER_CRPARTY] FOREIGN KEY ([CRPARTY]) REFERENCES [dbo]. [Account]([ID])

GO

ALTER TABLE [dbo]. [Voucher] CHECK  CONSTRAINT  [FK_ACCOUNT_ID_VOUCHER_CRPARTY] 
GO