【问题标题】:Multiple Foreign key with a same primary key具有相同主键的多个外键
【发布时间】:2017-08-24 05:15:51
【问题描述】:

我使用 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 之间创建关系,但我无法创建第二个外键关系。

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

【问题讨论】:

  • 错误是什么?您的表是否已经包含数据?
  • 请粘贴您尝试创建外键的代码。在创建 2 个引用另一个表的 1 个 PK 的 FK 时应该没有任何问题,考虑到它们没有数据不匹配(如果有的话)。
  • 这是我通过 Microsoft SQL Server Management Studio 创建 FK 关系时遇到的错误。两张桌子都是空的。 "'Account' 表成功保存 'Voucher' 表 - 无法创建关系 'FK_Voucher_Account1'。ALTER TABLE 语句与 FOREIGN KEY 约束 "FK_Voucher_Account1" 冲突。冲突发生在数据库 "SKUMAR" 表 "dbo.Account" 中, “ID”列。“
  • 将您的第二个外键重命名为更好的名称。重命名您的外键,如 FK_Account_ID_Voucher_Crparty 和 FK_Account_ID_Voucher_Drparty
  • 已经不一样了,第一个是FK_Voucher_Account,第二个是FK_Voucher_Account1

标签: sql sql-server


【解决方案1】:

由于Voucher(CRPARTY) 列和Account(Id) 列之间的数据不匹配,可能会出现外键冲突错误。 CRPARTY 表中可用的行必须在 Account 表中。

使用以下查询进行验证。

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

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

【讨论】:

  • 我通过清空所有相关表然后创建两个 FK 得到它。谢谢。
  • 我想问的一个问题是为什么有数据时不创建FK?凭证表中的DRPARTY和CRPARTY列中的数据在Account表中可用。
  • @Hemal 数据之间没有任何不匹配,CRPARTY 列中可用的某些行可能在 Account(Id) 列中不可用,因此我要求使用上述查询进行验证。跨度>
  • 你是对的,但事实并非如此。我在帐户表中有两个 ID 为 1 和 2 的帐户。我通过添加 1 作为 DRPARTY 和 2 作为 CRPARTY 创建了一张凭证。但是当两个表中都存在数据时,它不允许我创建第二个 FK。现在,当两个表都为空时,我可以创建两个 FK。
【解决方案2】:

您可以删除表之间的 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

【讨论】:

  • 我通过清空所有相关表然后创建两个 FK 得到它。谢谢。
猜你喜欢
  • 2020-12-23
  • 2011-07-11
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多