【问题标题】:Adding column with primary key in existing table在现有表中添加具有主键的列
【发布时间】:2012-12-17 21:19:07
【问题描述】:

我正在尝试将主键添加到现有表名 Product_Details 中新添加的列。

添加了新列:Product_Detail_IDintnot null

我正在尝试将主键添加到Product_Detail_ID(请注意:此表没有分配其他主键或外键)

我正在尝试使用此查询,但出现错误。

ALTER TABLE Product_Details
ADD CONSTRAINT pk_Product_Detils_Product_Detail_ID PRIMARY KEY(Product_Detail_ID)
GO

错误:

CREATE UNIQUE INDEX 语句终止,因为发现对象名称 'dbo.Product\_Details' 和索引名称 'pk\_Product\_Detils' 的重复键。重复键值为 (0)。

我在这里遗漏了什么吗?我正在使用 SQL Server 2008 R2。我将不胜感激。

【问题讨论】:

  • 您的表在该列中有重复值,但主键要求该列中的值是唯一的。为了创建 PK,您必须删除重复项。
  • 表格是否包含数据?在这种情况下,您必须确保新列具有唯一值,然后才能使其成为 pk 列。
  • 您是否使用新值更新了该列?或者它们仍然是0,如您的错误消息中所示。确保该字段中的 每个 值都不同于其他所有值...
  • 这条消息sooo明确指出这里出了什么问题……你读了吗?

标签: sql database sql-server-2008 primary-key


【解决方案1】:

如果您希望 SQL Server 自动为新列提供值,请将其设为标识。

ALTER TABLE Product_Details DROP COLUMN Product_Detail_ID
GO
ALTER TABLE Product_Details ADD Product_Detail_ID int identity(1,1) not null
GO
ALTER TABLE Product_Details
add CONSTRAINT pk_Product_Detils_Product_Detail_ID primary key(Product_Detail_ID)
GO

【讨论】:

  • 感谢您的帮助。这个查询也对我有用,但我手动插入数据(编辑 200),然后用我的查询执行..它有效!!
  • 注意:这将删除此列中的所有数据
【解决方案2】:

在mysql中,我可以通过以下查询实现

ALTER TABLE table_name ADD new_column int NOT NULL AUTO_INCREMENT primary key

【讨论】:

  • 对于 SQL Server,使用 IDENTITY 而不是 AUTO_INCREMENT
【解决方案3】:

您收到错误是因为您有未满足约束的现有数据。

有两种方法可以解决它:

  • 在添加约束之前清理现有数据
  • 使用“WITH NOCHECK”选项添加约束,这将停止 sql server 检查现有数据,只检查新数据

【讨论】:

  • 我要补充一点,使用WITH NOCHECK 几乎总是一个坏主意:)
【解决方案4】:
ALTER TABLE Jaya 
  ADD CONSTRAINT no primary key(No);

这里Jaya是表名,

no 是列名,

ADD CONSTRAINT是我们给的主键关键字

【讨论】:

    【解决方案5】:

    如果你想在现有表中添加一个新列,比如 deptId,那么你可以使用下面的代码来完成。

    ALTER TABLE department ADD COLUMN deptID INT;
    

    它将创建名为 deptID 的新列。

    现在,如果您想在创建新列的同时添加约束,那么您可以使用下面的代码来完成。在下面的代码中,我将主键添加为约束。您也可以添加另一个约束来代替主键,如外键、默认值等。

    ALTER TABLE department ADD COLUMN deptID INT NOT NULL ADD CONSTRAINT PRIMARY KEY(deptID);
    

    【讨论】:

      【解决方案6】:

      将主键添加到第一个位置

      ALTER TABLE table_name 
      ADD column_name INT PRIMARY KEY AUTO_INCREMENT FIRST;
      

      参考:Stack Overflow | Tech On The Net

      【讨论】:

        【解决方案7】:

        k。朋友 命令: sql> alter table tablename 添加主键(col_name);

        例如:alter table pk_Product_Detils 添加主键(Product_Detail_ID);

        【讨论】:

        • 这个答案与已经提供的答案有什么不同?
        猜你喜欢
        • 2020-09-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-27
        • 2012-08-01
        • 2015-04-01
        • 2012-11-25
        • 1970-01-01
        • 2012-11-04
        相关资源
        最近更新 更多