Trong SQL Server 2005 hoặc mới hơn, bạn có thể sử dụng kịch bản này:
-- drop PK constraint if it exists
IF EXISTS (SELECT * FROM sys.key_constraints WHERE type = 'PK' AND parent_object_id = OBJECT_ID('dbo.YourTable') AND Name = 'PK_YourTable')
ALTER TABLE dbo.YourTable
DROP CONSTRAINT PK_YourTable
GO
-- drop column if it already exists
IF EXISTS (SELECT * FROM sys.columns WHERE Name = 'RowId' AND object_id = OBJECT_ID('dbo.YourTable'))
ALTER TABLE dbo.YourTable DROP COLUMN RowId
GO
-- add new "RowId" column, make it IDENTITY (= auto-incrementing)
ALTER TABLE dbo.YourTable
ADD RowId INT IDENTITY(1,1)
GO
-- add new primary key constraint on new column
ALTER TABLE dbo.YourTable
ADD CONSTRAINT PK_YourTable
PRIMARY KEY CLUSTERED (RowId)
GO
Tất nhiên, kịch bản này vẫn có thể thất bại, nếu các bảng khác đang tham chiếu này dbo.YourTable
sử dụng ràng buộc khoá ngoại vào trước RowId
cột hiện có ...
cập nhật: và tất nhiên, bất cứ nơi nào tôi sử dụng dbo.YourTable
hoặc PK_YourTable
, bạn phải thay thế những placeholder với thực tế tên bảng/chế từ cơ sở dữ liệu riêng của bạn (bạn không đề cập đến những gì họ đã, trong câu hỏi của bạn .....)
Nguồn
2012-02-06 10:23:40
Việc bỏ một cột và loại bỏ ràng buộc khóa chính là những thứ khác nhau. Dòng đầu tiên của bạn là không rõ ràng. Bạn cũng có thể đăng nỗ lực của bạn vào điều này và giải thích nơi bạn đang mắc kẹt? – Oded
Bạn thật sự muốn gì? –
Bạn có muốn giữ lại RowId "cũ" cho đến khi toàn bộ chuỗi được hoàn tất không? Đây có phải là "cũ" RowId dự kiến sẽ được IDENTITY quá? Tại sao thay thế một cột có cùng tên? – gbn