【问题标题】:Composite primary key with foreign key relationships to multiple tables. SQL Server 2008 Errors具有与多个表的外键关系的复合主键。 SQL Server 2008 错误
【发布时间】:2011-04-01 21:25:07
【问题描述】:
使用 [Fk_Test2] 走 /****** 对象:表 [dbo].[Owners] 脚本日期:08/20/2010 16:52:44 ******/ 设置 ANSI_NULLS ON 走 设置 QUOTED_IDENTIFIER ON 走 设置 ANSI_PADDING ON 走 创建表 [dbo].[所有者]( [所有者] [varchar](10) 非空, 约束 [PK_Owners] 主键集群 ( [所有者] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) 开 [主要] 走 设置 ANSI_PADDING 关闭 走 /****** 对象:表 [dbo].[Key] 脚本日期:08/20/2010 16:49:57 ******/ 设置 ANSI_NULLS ON 走 设置 QUOTED_IDENTIFIER ON 走 设置 ANSI_PADDING ON 走 创建表 [dbo].[Key]( [所有者] [varchar](10) 非空, [key_id] [varchar](10) 非空, [描述] [varchar](10) NOT NULL, 约束 [PK_Key] 主键集群 ( [所有者] ASC, [key_id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) 开 [主要] 走 设置 ANSI_PADDING 关闭 走 ALTER TABLE [dbo].[Key] WITH CHECK ADD CONSTRAINT [FK_Key_Owners] FOREIGN KEY([owner]) 参考 [dbo].[所有者] ([所有者]) 走 ALTER TABLE [dbo].[Key] 检查约束 [FK_Key_Owners] 走 /****** 对象:表 [dbo].[Bldg] 脚本日期:08/20/2010 16:50:29 ******/ 设置 ANSI_NULLS ON 走 设置 QUOTED_IDENTIFIER ON 走 设置 ANSI_PADDING ON 走 创建表 [dbo].[Bldg]( [大厦] [varchar](10) 非空, [所有者] [varchar](10) 非空, 约束 [PK_Bldg] 主键集群 ( [大厦] ASC, [所有者] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) 开 [主要] 走 设置 ANSI_PADDING 关闭 走 ALTER TABLE [dbo].[Bldg] WITH CHECK ADD CONSTRAINT [FK_Bldg_Owners] FOREIGN KEY([owner]) 参考 [dbo].[所有者] ([所有者]) 走 ALTER TABLE [dbo].[Bldg] 检查约束 [FK_Bldg_Owners] 走 /****** 对象:表 [dbo].[KeyToBuilding] 脚本日期:08/20/2010 17:13:52 ******/ 设置 ANSI_NULLS ON 走 设置 QUOTED_IDENTIFIER ON 走 设置 ANSI_PADDING ON 走 创建表 [dbo].[KeyToBuilding]( [所有者] [varchar](10) 非空, [大厦] [varchar](10) 非空, [key_id] [varchar](10) 非空, 约束 [PK_KeyToBuilding] 主键集群 ( [所有者] ASC, [大厦] ASC, [key_id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) 开 [主要] 走 设置 ANSI_PADDING 关闭 走 ALTER TABLE [dbo].[KeyToBuilding] WITH CHECK ADD CONSTRAINT [FK_KeyToBuilding_Key] FOREIGN KEY([owner], [key_id]) 参考 [dbo].[Key] ([owner], [key_id]) 走 ALTER TABLE [dbo].[KeyToBuilding] 检查约束 [FK_KeyToBuilding_Key] 走 ALTER TABLE [dbo].[KeyToBuilding] WITH CHECK ADD CONSTRAINT [FK_KeyToBuilding_Bldg] FOREIGN KEY([owner], [bldg]) 参考文献 [dbo].[Bldg] ([owner], [bldg]) 走 ALTER TABLE [dbo].[KeyToBuilding] 检查约束 [FK_KeyToBuilding_Bldg] 走

每当我尝试进行设置时,我都会收到错误消息 “表“Key”或“Bldg”中的列与现有的主键或 UNIQUE 约束不匹配。

我是否试图以错误的方式实现这种关系?还是做一些蠢事?

该系统用于跟踪人们进入不同建筑物的钥匙(物理)。这就是为什么有 key_id 和 Key 它们不是数据库键的原因。

【问题讨论】:

  • 如果您发布用于创建这些表的实际 DDL 会更容易。
  • 考虑包含一个与 Bldg 和 Key 有关系的 Owner 表
  • 我把我的表格模型改成了一个实际的脚本另外我得到的错误是在 FK_KeyToBuilding_Bldg 它说 Msg 1776, Level 16, State 0, Line 2 没有主要或候选被引用表“dbo.Bldg”中与外键“FK_KeyToBuilding_Bldg”中的引用列列表匹配的键。

标签: sql-server-2008 database-design


【解决方案1】:

这是语法错误的来源;

Bldg 表中的主键是:

    CONSTRAINT PK_Bldg PRIMARY KEY (bldg, [owner])

KeyToBuilding 表中,FK_KeyToBuilding_Bldg 你试图引用([owner], bldg) 而不是(bldg, [owner])

如果你简单地清理一下代码会有帮助,下面的代码执行得很好:

CREATE TABLE dbo.Owners (
    [owner] varchar(10) NOT NULL

  , CONSTRAINT PK_Owners PRIMARY KEY CLUSTERED ([owner])
) ;


CREATE TABLE dbo.[Key] (
    [owner] varchar(10) NOT NULL
  , key_id  varchar(10) NOT NULL
  , [description] varchar(10) NOT NULL

  , CONSTRAINT [PK_Key] PRIMARY KEY ([owner], key_id)
) ;

ALTER TABLE dbo.[Key] ADD CONSTRAINT FK_Key_Owners
    FOREIGN KEY([owner] REFERENCES dbo.Owners ([owner])  ;


CREATE TABLE dbo.Bldg (
    bldg    varchar(10) NOT NULL
  , [owner] varchar(10) NOT NULL

  , CONSTRAINT PK_Bldg PRIMARY KEY (bldg, [owner])
) ;

ALTER TABLE dbo.Bldg ADD CONSTRAINT FK_Bldg_Owners
    FOREIGN KEY([owner] REFERENCES dbo.Owners ([owner]);


CREATE TABLE dbo.KeyToBuilding (
    [owner] varchar(10) NOT NULL
  , bldg    varchar(10) NOT NULL
  , key_id  varchar(10) NOT NULL

    , CONSTRAINT PK_KeyToBuilding PRIMARY KEY ([owner], key_id)
);

ALTER TABLE dbo.KeyToBuilding ADD
    CONSTRAINT FK_KeyToBuilding_Key
      FOREIGN KEY([owner], key_id) REFERENCES dbo.[Key] ([owner], key_id)

  , CONSTRAINT FK_KeyToBuilding_Bldg
      FOREIGN KEY(bldg, [owner]) REFERENCES dbo.Bldg (bldg, [owner]) ;

【讨论】:

    【解决方案2】:

    您应该能够创建它们,您使用什么方法来创建导致错误的关系?

    可能是您在反向创建它们。

    还要检查表中是否存在冲突数据。 KeyToBuilding 中的所有行都需要在 Bldg 和 Key 中才能创建 FK 关系。当所有 3 个表都为空时,最容易创建关系。

    【讨论】:

    • 我正在尝试在 sql 管理控制台中创建它们。所有的桌子都是空的。我单击 KeyToBuilding 上的设计,然后单击关系,然后尝试设置一个外键,将 Bldg 或 Key 作为主表,但它不起作用。
    • 换一种方式试试——在 Bldg 或 Key 上单击 Design 并使用 KeyToBuilding 设置 FK
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 2013-04-30
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多