【问题标题】:Error when trying to alter column type尝试更改列类型时出错
【发布时间】:2018-06-19 01:09:26
【问题描述】:

我在 SQL Server 2016 中有一个现有的 DATETIME 列。我需要编写一个 DDL 脚本将其更改为 DATE 类型。

当我运行以下脚本时,我收到一条错误消息。不知道如何解决...

ALTER TABLE [dbo].[TBL_MyTable] 
    DROP CONSTRAINT [PK__TBL__3F4E83EE204C47AA];

ALTER TABLE [dbo].[TBL_MyTable] 
    ALTER COLUMN myDate DATE;

ALTER TABLE [dbo].[TBL_MyTable] 
    ADD CONSTRAINT [PK__TBL__3F4E83EE204C47AA]; 

错误信息:

消息 5074,第 16 级,状态 1,第 2 行
对象“PK__TBL__3F4E83EE204C47AA”依赖于列“myDate”。

消息 4922,第 16 级,状态 9,第 2 行
ALTER TABLE ALTER COLUMN myDate 失败,因为一个或多个对象访问此列。

表定义:

CREATE TABLE "dbo"."TBL_MyTable"
(
     column1,
     myDate datetime NOT NULL,,
     column2,
     column3,

     CONSTRAINT PK__TBL__3F4E83EE204C47AA 
         PRIMARY KEY (column1, myDate, column2, column3)
)
GO

CREATE UNIQUE INDEX PK__TBL__3F4E83EE204C47AA 
    ON "dbo"."TBL_MyTable" (column1, myDate, column2, column3)
GO

谢谢。

【问题讨论】:

  • 您是在尝试ALTER 两个表,还是忘记在示例中的所有三个语句中混淆表名?
  • 首先:如果您要自己指定约束名称,请使它们有用 - 不要使用这些神秘的系统生成名称!另外:该唯一索引完全没用,因为您已经在相同的列上定义了 PK - 按定义的 PK 是唯一的 - 创建第二个唯一索引没有用在这些列上

标签: sql-server ddl


【解决方案1】:

我将创建 DATE 列作为新列,填充它,然后删除 DATETIME 列。

ALTER TABLE [dbo].[TBL_MyTable] DROP CONSTRAINT [PK__TBL__3F4E83EE204C47AA]
GO
ALTER TABLE [dbo].[TBL_MyTable] ADD MyDateCol DATE
GO

UPDATE [dbo].[TBL_MyTable]
SET MyDateCol = CAST(myDate AS DATE)
GO

ALTER TABLE [dbo].[TBL_MyTable] DROP COLUMN myDate
GO

CREATE UNIQUE INDEX PK__TBL__3F4E83EE204C47AA ON [dbo].[TBL_MyTable]
(
  column1,
  MyDateCol,
  column2,
  column3
)
GO

【讨论】:

    【解决方案2】:

    你可以使用下面的代码

    更改表 [dbo].[TBL_MyTable] 丢弃约束 [PK__TBL__3F4E83EE204C47AA];

    更改表 [dbo].[TBL_MyTable] ALTER COLUMN myDate DATE 不为空;

    更改表 [dbo].[TBL_MyTable] 添加约束 [PK__TBL__3F4E83EE204C47AA] 主键 ( 第 1 列, 我的约会, 第 2 列, 第 3 列 )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多