2012-02-06 35 views
15

Tôi là sinh viên của RDBMS.Thêm cột khóa chính trong bảng SQL

Tôi có câu hỏi rất cơ bản để nói rằng tôi có một Bảng hiện có trong máy chủ SQL. Kịch bản sẽ làm gì để thay đổi bảng.

  • Thả cột 'RowId' nếu tồn tại.
  • Thả hạn chế nếu tồn tại.
  • Thêm một cột mới 'RowId' vào bảng.
  • Đặt cột này làm khóa chính.
  • Loại tự động int.
+1

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

+0

Bạn thật sự muốn gì? –

+0

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

Trả lời

38

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: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 .....)

+0

bảng không phải là điều chỉnh bất cứ nơi nào nhưng nó vẫn không thành công ... –

+0

Msg 5074, Cấp 16, Tiểu bang 1, Dòng 4 Đối tượng 'PK_tempTable' phụ thuộc vào cột 'RowId'. –

+0

Vâng, sau đó bao gồm một 'ALTER TABLE dbo.YourTable DROP CONSTRAINT PK_tempTable' - là PK được gọi là cái gì khác hơn là tên bảng ??? Nếu ràng buộc của bạn không được gọi là 'PK_YourTable', bạn phải ** điều chỉnh kịch bản của tôi ** cho phù hợp, tất nhiên! –

7

Lưu ý: câu trả lời này đã được bổ sung trước khi câu hỏi cập nhật

  • Thêm cột mới (lưu ý: bạn chỉ có thể có một cột IDENTITY mỗi bảng)
  • Drop cũ chính chủ chốt
  • Thêm chìa khóa
  • Drop cột mới chính cũ nếu cần

Mẫu kịch bản:

CREATE TABLE whatever (
    OldPKColumn uniqueidentifier NOT NULL, 
    CONSTRAINT PK_whatever PRIMARY KEY (OldPKColumn) 
    ) 

ALTER TABLE whatever 
    ADD RowId int NOT NULL IDENTITY (1,1); 

ALTER TABLE whatever 
    DROP CONSTRAINT PK_whatever; 

ALTER TABLE whatever WITH CHECK 
    ADD CONSTRAINT PK_whatever PRIMARY KEY CLUSTERED (RowId); 

ALTER TABLE whatever 
    DROP COLUMN oldPKcolumn; 

Và một ý nghĩ ngẫu nhiên ... Bạn cố gắng để thiết lập lại một cột IDENTITY?
Nếu vậy, sau đó sử dụng DBCC CHECKIDENT

+7

@SOF Người dùng: Tôi đã có một ý tưởng tốt hơn. Đặt một câu hỏi hay hơn và đừng thô lỗ. Bạn đã thay đổi câu hỏi trong khi tôi đang trả lời, và tôi đã yêu cầu làm rõ trong một bình luận. – gbn

1

Chỉ cần một lời nhận xét để cải thiện những câu trả lời tuyệt vời (không thể sử dụng ý kiến ​​nào - Tôi là một điểm uy tín xa đặc quyền đó) và tham khảo trong tương lai cho bản thân mình:

một SẮC (autonumber) cột mới có thể được thêm và làm khóa chính trong một tuyên bố đơn cũng như:

ALTER TABLE ADD Dù ROWID int SẮC NOT NULL PRIMARY kEY;

Tôi không muốn làm phiền với các tên hạn chế khi nó không hữu ích.

Các vấn đề liên quan