【问题标题】:How to alter an already created table to drop and re-create the primary key? [closed]如何更改已创建的表以删除并重新创建主键? [关闭]
【发布时间】:2020-12-23 01:45:33
【问题描述】:

我有这张桌子:

Create table Product (
    [Id] int primary key not null,
    [Name] varchar (250),
    [Price] money
)

表已经创建好了,现在我想用[Id]作为主键[Name]

我不想重新创建表格,而只想ALTER它。

【问题讨论】:

  • 你读过ALTER statement,如果没有,我会推荐。
  • 为什么要组合PK?这会导致各种问题。

标签: sql sql-server sql-server-2008 alter-table


【解决方案1】:

ALTER TABLE Product DROP PRIMARY KEY, ADD PRIMARY KEY(Id, Name);

【讨论】:

  • 怎么能被赞成!这是一个错误的 T-SQL
  • 表已经创建
【解决方案2】:

您应该始终明确地命名您的约束。 由于您没有指定 CONSTRAINT 名称,SQL Server 将为您的 PK 生成一个默认名称,例如:PK__Product__9CC368536561EF8B

因此,您需要使用 SSMS 手动删除它,或者使用动态 SQL,查询 sys.key_constraints 以获取名称并删除约束,因为它已经 answered here

此外,您还需要在创建新 PK 之前将列 Name 设置为 NOT NULL,并确保所有行都没有 NULL 值

ALTER TABLE Product ALTER COLUMN Name varchar (250) NOT NULL;

这是一个db-fiddle

【讨论】:

    【解决方案3】:

    要修改主键,您可以执行 ALTER TABLE Product DROP PRIMARY KEY 语句来删除现有的主键,然后执行 ALTER TABLE ALTER column-name column-alteration 语句来设置表的新主键

    ALTER TABLE Product DROP PRIMARY KEY, ADD PRIMARY KEY(Id, Name);
    

    【讨论】:

      【解决方案4】:

      我复制了您的问题以及解决方案...

      在这里我找到了您的表的主要名称

      select CONSTRAINT_NAME 
      from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
      where TABLE_NAME = 'Product' and CONSTRAINT_TYPE = 'PRIMARY KEY'
      

      从上面的查询中获取返回值,并在下面的查询中替换(PK_Product_3214EC07822AF903)

      alter table Product drop constraint PK__Product__3214EC07822AF903
      

      主键不能为空

      alter table Product alter column [Name] varchar (250) NOT NULL
      

      最后,设置新的主键

      alter table Product add constraint PK_Product primary key ([Name])
      

      【讨论】:

      • OP 想要一个组合的 PK (Id, Name)
      猜你喜欢
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多