SQL Server如何从列中删除标识

时间:2009-03-31 19:50:04

标签: sql-server sql-server-2005

是否有一种简单的方法可以从SQL Server 2005中的表中删除标识?

当我使用Management Studio时,它会生成一个脚本,用于创建没有标识的镜像表,复制数据,删除表,然后重命名镜像表等。此脚本中有5231行,因为此表/列有很多FK关系。

运行简单的改变/降低让我感觉更舒服。有什么想法吗?

修改
我想我将使用企业管理器中的5,231行脚本。但是,我打算将它分解成更小的部分,我可以更好地运行和控制。这个表“行为”很奇怪,如果你试图删除1行(即使你刚插入一行,这不在任何其他FK表中),你会收到这个错误:

delete MyTable where MyPrimaryKey=1234  

Msg 8621, Level 17, State 2, Line 1
    The query processor ran out of stack space during query optimization. Please simplify the query.

毫无疑问,所有的FK。当我们进行这些架构和相关的应用程序更改时,我们将暂停对应用程序的所有访问并以单用户模式运行。但是,我们需要快速运行,我需要知道需要多长时间。我想我只需要测试,测试,测试。

3 个答案:

答案 0 :(得分:32)

如果您使用的是SQL Server 2005或更高版本,则可以将此作为简单的元数据更改(NB:要求支持分区的版本,如我最初所述)。

保罗·怀特(Paul White)在this Microsoft Connect Item上以无耻的方式窃取了示例代码。

USE tempdb;
GO
-- A table with an identity column
CREATE TABLE dbo.Source 
(row_id INTEGER IDENTITY PRIMARY KEY NOT NULL, data SQL_VARIANT NULL);
GO
-- Some sample data
INSERT dbo.Source (data)
VALUES (CONVERT(SQL_VARIANT, 4)),
        (CONVERT(SQL_VARIANT, 'X')),
        (CONVERT(SQL_VARIANT, {d '2009-11-07'})),
        (CONVERT(SQL_VARIANT, N'áéíóú'));
GO
-- Remove the identity property
BEGIN TRY;
    -- All or nothing
    BEGIN TRANSACTION;

    -- A table with the same structure as the one with the identity column,
    -- but without the identity property
    CREATE TABLE dbo.Destination 
    (row_id INTEGER PRIMARY KEY NOT NULL, data SQL_VARIANT NULL);

    -- Metadata switch
    ALTER TABLE dbo.Source SWITCH TO dbo.Destination;

    -- Drop the old object, which now contains no data
    DROP TABLE dbo.Source;

    -- Rename the new object to make it look like the old one
    EXECUTE sp_rename N'dbo.Destination', N'Source', 'OBJECT';

    -- Success
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    -- Bugger!
    IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
    PRINT ERROR_MESSAGE();
END CATCH;
GO

-- Test the the identity property has indeed gone
INSERT dbo.Source (row_id, data)
VALUES (5, CONVERT(SQL_VARIANT, N'This works!'))

SELECT row_id,
        data
FROM    dbo.Source;
GO

-- Tidy up
DROP TABLE dbo.Source;

答案 1 :(得分:8)

我不相信你可以直接删除列的IDENTITY部分。你最好的选择可能是:

  • 向表中添加另一个非标识列
  • 将标识值复制到该列
  • 删除原始标识列
  • 重命名新列以替换原始列

如果标识列是键或其他约束的一部分,则需要删除这些约束并在完成上述操作后重新创建它们。

答案 2 :(得分:5)

您可以向表中添加不是标识列的列,复制数据,删除原始列,并将新列重命名为旧列并重新创建索引。

Here是一个显示示例的链接。仍然不是一个简单的改变,但肯定比5231线好。