Sql-Server
如何刪除多個表的標識規範
我的數據庫中有 109 個表。現在我正在使用身份插入遷移到 Amazon 伺服器,並且我想刪除所有表的自動增量列規範。如何在 SQL Server 2008 中為所有表設置自動增量列,即標識規範為“否”?
例如,我有
CREATE TABLE dbo.tbl_acc ( a1 NUMERIC (18) IDENTITY NOT NULL, a2 NUMERIC (18) NULL, a3 VARCHAR (4000) NULL, a4 VARCHAR (3999) NULL, CONSTRAINT PK_tbl_acc PRIMARY KEY (a1) ) GO
現在我想刪除 IDENTITY,不僅是為了這個,而且是為了所有剩餘的表。
沒有用於從 SQL Server 中的列中刪除標識屬性的內置命令。您可能必須創建一個新表,複製所有數據,然後重命名該表。這可能既耗時又尷尬,尤其是當您有外鍵約束、模式綁定函式、索引視圖等時。
也就是說,至少有一種方法可以避免複製數據,但這也不是在所有情況下都有效,尤其是在您有外鍵的情況下。範例如下:
範例表和數據
CREATE TABLE dbo.tbl_acc ( a1 NUMERIC (18) IDENTITY NOT NULL, a2 NUMERIC (18) NULL, a3 VARCHAR (4000) NULL, a4 VARCHAR (3999) NULL, CONSTRAINT PK_tbl_acc PRIMARY KEY (a1) ) GO INSERT dbo.tbl_acc (a2, a3, a4) VALUES (1, 'a', 'b'), (2, 'c', 'd');
元數據傳輸和重命名
-- Copy of the source table specification, -- but without the IDENTITY property -- Note the PRIMARY KEY constraint name -- also has to be different CREATE TABLE dbo.tbl_acc2 ( a1 NUMERIC (18) NOT NULL, a2 NUMERIC (18) NULL, a3 VARCHAR (4000) NULL, a4 VARCHAR (3999) NULL, CONSTRAINT PK_tbl_acc2 PRIMARY KEY (a1) ) GO BEGIN TRANSACTION -- Transfer the data as a metadata operation -- TODO: Add error handling ALTER TABLE dbo.tbl_acc SWITCH TO dbo.tbl_acc2; -- Drop the source table (now empty) DROP TABLE dbo.tbl_acc; -- Rename the table EXECUTE sys.sp_rename @objname = N'dbo.tbl_acc2', @newname = N'tbl_acc', @objtype = 'OBJECT'; -- Rename the primary key EXECUTE sys.sp_rename @objname = N'dbo.tbl_acc.PK_tbl_acc2', @newname = N'PK_tbl_acc', @objtype = 'INDEX'; COMMIT TRANSACTION;