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

标签 sql sql-server create-table alter-table drop-table

我试图像这样在SQL中的表末尾添加一列:


打开设计视图
添加栏
生成并复制脚本
运行,然后保存脚本


由于某些原因,当我的同事这样做时,它会生成通常的ALTER TABLE脚本。

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

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 Server会这样做。
这些链接可以提供有关在SQL Server中更改表的一些信息。

SQL Server - Alter table vs drop and create

Alter Table Problems

关于sql - 添加列时,我必须创建和删除而不是更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53741720/

相关文章:

MySQL自动增量每条记录增加超过+1

mysql 列自动索引?

sql - 如何理解 postgres EXPLAIN 输出

sql - sql server 2008 r2 中的数字(18, 0) 是什么

sql - 排序规则冲突错误,将存储过程的排序规则设置为数据库默认值

sql-server - Sequelize mssql : order by primary key and limit

sql - 如何将 IN 运算符与 LIKE 条件结合起来(或获得可比较结果的最佳方法)

missing-data - 在 DolphinDB 中,如何将具有开始日期和结束日期的 1 条记录转换为每天的多条记录?

sql - Html5 本地数据存储,跨设备同步

sql - 使用 LAG() 和 PARTITION BY 返回日期后 10 天内的行