如何更改表复合主键

Posted

技术标签:

【中文标题】如何更改表复合主键【英文标题】:how to alter table Composite primary key 【发布时间】:2009-08-31 12:34:02 【问题描述】:
CREATE TABLE [dbo].[INVS_ITEM_LOCATIONS]
([DEPARTMENT_CODE] [varchar](3) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
 [IM_INV_NO] [numeric](10, 0) NOT NULL,
 [LOCATION_CODE] [varchar](2) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
 [CURR_QTY] [numeric](10, 0) NOT NULL CONSTRAINT [DF__INVS_ITEM__CURR___1352D76D]  DEFAULT ((0)),
 [DO_QTY] [numeric](10, 0) NOT NULL CONSTRAINT [DF__INVS_ITEM__DO_QT__1446FBA6]  DEFAULT ((0)),
 [ALLOC_QTY] [numeric](10, 0) NOT NULL CONSTRAINT [DF__INVS_ITEM__ALLOC__153B1FDF]  DEFAULT ((0)),
 [YOB_QTY] [numeric](10, 0) NOT NULL CONSTRAINT [DF__INVS_ITEM__YOB_Q__162F4418]  DEFAULT ((0)),
 [FOC_QTY] [numeric](10, 0) NULL CONSTRAINT [DF__INVS_ITEM__FOC_Q__17236851]  DEFAULT ((0)),
 [USER_CREATED] [varchar](25) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
 [DATE_CREATED] [datetime] NOT NULL,
 [USER_MODIFIED] [varchar](25) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
 [DATE_MODIFIED] [datetime] NULL,

 CONSTRAINT [INVS_ITEM_LOCATIONS_PK] 
 PRIMARY KEY CLUSTERED ([DEPARTMENT_CODE] ASC,
 [IM_INV_NO] ASC, [LOCATION_CODE] ASC)
 WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

这是我的表结构......如何删除表中的复合主键,并且我应该将外键添加到 im_inv_no 引用表是 invs_location 包含 im_inv_no 和部门代码应该是相同的主键.pls帮助

【问题讨论】:

请立即尝试将“sql-server-2005”等有用且相关的标签添加到您的下一个问题中。它可以让人们更好地了解您正在使用什么以及如何向您寻求帮助! 你打算把一些主键放在桌子上,对吧?如果您的复合键中的文件是唯一的,那么当您至少删除主键时,您应该在它们上放置一个唯一索引,否则您将来会遇到数据完整性问题。 【参考方案1】:

要删除复合主键,请使用:

ALTER TABLE dbo.INVS_ITEM_LOCATIONS
  DROP CONSTRAINT INVS_ITEM_LOCATIONS_PK

要添加外键,请使用:

ALTER TABLE dbo.INVS_ITEM_LOCATIONS
  ADD CONSTRAINT FK_INV_NO_REFERENCE
  FOREIGN KEY(IM_INV_NO, DEPARTMENT_CODE)
  REFERENCES dbo.invs_location(IM_INV_NO, DEPARTMENT_CODE)

这些都是非常基本的初学者 SQL 问题 - 我会强烈建议您阅读各种优秀的 SQL 教程之一,以便在发布之前先习惯 SQL这里的每一个小问题......

W3Schools SQL Tutorial

马克

【讨论】:

好的,那就做正确的事,接受答案!成为一个优秀的 SO 公民,以便在未来获得答案!【参考方案2】:

您可以创建具有所需修改的新表,复制数据,然后将新表重命名为与旧表相同的名称并删除旧表。这可能也是最有效的方法。

【讨论】:

使用 ALTER TABLE 命令是最有效的方法。但是,如果您使用的是生产数据库,则使用“创建副本并重命名”方法将是破坏性最小的方式(即锁定/停机时间)。

以上是关于如何更改表复合主键的主要内容,如果未能解决你的问题,请参考以下文章

如何识别任何 Mysql 数据库表中的复合主键?

如何在 SQL 中定义复合主键?

Hibernate:复合主键 - 外键:如何在两个表之间映射各个字段

复合主键的一部分可以用作另一个表的复合主键的一部分吗?

RedShift - 如何通过复合主键过滤表中的记录?

SQL:选择另一个表中没有复合主键的条目