微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将带有标识列的表数据和结构及其值复制到同一数据库中的另一个表只需更改表名

如何解决如何将带有标识列的表数据和结构及其值复制到同一数据库中的另一个表只需更改表名

我无法将表数据和结构复制到另一个表,因为我想保留 Identity 列的 Id 列并保留其原始值而不是从 1 开始

我使用下面的 sql 插入除 IDMY_TABLEMY_TABLE_NEW 列之外的所有数据,因为它有错误说明

仅当使用列列表且 IDENTITY_INSERT 为 ON 时,才能为表“My_TABLE_NEW”中的标识列指定显式值。

但我已将其设置为如下 sql

IF NOT EXISTS (select * from sys.objects where name = 'My_TABLE_NEW')
BEGIN
    CREATE TABLE [dbo].[My_TABLE_NEW]
    (
        [ID] [int] IDENTITY(1,1) NOT NULL,[OBJECT_ID] [int] NOT NULL,[YEAR_MONTH] [int] NOT NULL,CONSTRAINT [PK_My_TABLE_NEW] 
            PRIMARY KEY CLUSTERED ([ID] ASC)
                        WITH (PAD_INDEX = OFF,STATISTICS_norECOmpuTE = OFF,IGnorE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
END
GO

IF EXISTS (SELECT * FROM sys.objects WHERE name = 'My_TABLE_NEW')
BEGIN
    SET IDENTITY_INSERT My_TABLE_NEW ON

    INSERT INTO My_TABLE_NEW
        SELECT [ID],[OBJECT_ID],[YEAR_MONTH]
        FROM My_TABLE

   SET IDENTITY_INSERT My_TABLE_NEW OFF
END
GO

有什么问题?

解决方法

尝试使用列名插入:

key
,

来自documentation

当现有标识列被选入新表时,新列将继承 IDENTITY 属性,除非满足以下条件之一:

The SELECT statement contains a join,GROUP BY clause,or aggregate function.

Multiple SELECT statements are joined by using UNION.

The identity column is listed more than one time in the select list.

The identity column is part of an expression.

The identity column is from a remote data source.

这意味着您可以使用 SELECT INTO 复制表,同时保留标识列,并且可以在后面添加 PK。

SELECT *
INTO My_TABLE_NEW
FROM My_TABLE

这是一个关于 fiddle 的演示。

,

您可以为此使用内置工具 sp_rename,只要您只是重命名表而不是尝试创建它的副本。

EXEC sp_rename 'My_TABLE','My_TABLE_NEW'
GO;

https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-rename-transact-sql?view=sql-server-ver15

如果要创建副本,则只需执行以下操作:

SELECT *
INTO My_TABLE_NEW
FROM My_TABLE

注意:如果这样做,则必须重新添加任何键约束、计算值列等。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。