添加列时,我必须创建并删除而不是更改?

问题描述 投票:0回答:1

我正在尝试在 SQL 中的表的末尾添加一列,如下所示:

  1. 打开设计视图
  2. 添加栏目
  3. 生成并复制脚本
  4. 运行,然后保存脚本

出于某种原因,当我的同事这样做时,它会生成通常的

ALTER TABLE
脚本。

当我尝试执行此操作时,它会生成一个脚本,该脚本创建临时表,然后删除现有表,然后用临时表替换原始表,如下所示:

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Table_Name
    DROP CONSTRAINT DF_Table_Name_NewColumnName
GO
CREATE TABLE dbo.Tmp_Table_Name
    (
    Id int NOT NULL IDENTITY (1, 1),
    Column1 varchar(16) NOT NULL,
    NewColumnName int NOT NULL,
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_Table_Name SET (LOCK_ESCALATION = TABLE)
GO
ALTER TABLE dbo.Tmp_Table_Name ADD CONSTRAINT
    DF_Table_Name_NewColumnName DEFAULT ((1)) FOR NewColumnName
GO
SET IDENTITY_INSERT dbo.Tmp_Table_Name ON
GO
IF EXISTS(SELECT * FROM dbo.Table_Name)
     EXEC('INSERT INTO dbo.Tmp_Table_Name (Id, Column1, NewColumnName)
        SELECT Id, Column1, NewColumnName FROM dbo.Table_Name WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_Table_Name OFF
GO
DROP TABLE dbo.Table_Name
GO
EXECUTE sp_rename N'dbo.Tmp_Table_Name', N'Table_Name', 'OBJECT' 
GO
ALTER TABLE dbo.Table_Name ADD CONSTRAINT
    PK_Table_Name PRIMARY KEY CLUSTERED 
    (
    Id
    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
COMMIT

我可以理解为什么如果我删除列或在表格中间添加列,它可能会这样做,但我不是,我只是在表格末尾添加一列。

这个问题实际上导致SQL Server删除了表中的所有数据,如果设计有什么问题的话(我最初是因为忘记向所需列添加默认值而发现这个问题的,它擦除了表中的所有数据..值得庆幸的是,仅在开发环境中)。

sql sql-server create-table alter-table drop-table
1个回答
0
投票

添加此答案以供参考。

如果您添加一列作为最后一列并使该列不为空,那么系统将提示您删除并重新创建该表。要解决此问题,请添加默认值,以便它知道将现有行设置为什么值。

© www.soinside.com 2019 - 2024. All rights reserved.