2013-02-01 42 views
24

Tôi có một cột trong db có 5 cột nhưng không có khóa chính. Một trong các cột được đặt tên myTable_id và là số nguyên.Đặt cột làm khóa chính nếu bảng không có khóa chính

Tôi muốn kiểm tra xem bảng có cột khóa chính hay không. Nếu không, hãy đặt myTable_id thành cột khóa chính và tạo cột nhận dạng. Có cách nào để làm việc này không?

tôi đã cố gắng với điều này:

ALTER TABLE Persons 
DROP CONSTRAINT pk_PersonID 

ALTER TABLE Persons 
ADD PRIMARY KEY (P_Id) 

và tôi nhận được lỗi cú pháp trong studio Management.

+3

bạn nên đánh dấu một câu trả lời là được chấp nhận. –

Trả lời

9
ALTER TABLE Persons 
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id) 
+1

làm cách nào về cột nhận dạng? –

+0

"Tôi muốn kiểm tra xem bảng có cột khóa chính" không được giải quyết hay không. – Monkey

43

này kiểm tra nếu khóa chính tồn tại, nếu không nói là nó được tạo ra

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = 'Persons' 
AND TABLE_SCHEMA ='dbo') 
BEGIN 
    ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id) 
END 
ELSE 
BEGIN 
    -- Key exists 
END 

fiddle: http://sqlfiddle.com/#!6/e165d/2

0

Tôi không nghĩ rằng bạn có thể làm điều đó. Để tạo cột vào cột nhận dạng, tôi nghĩ bạn phải bỏ toàn bộ bảng.

+1

Bạn không thể chuyển đổi thành nhận dạng nhưng bạn có thể thêm nhận dạng vào bảng – Paparazzi

2

Bạn có thể kiểm tra xem khóa chính có tồn tại hay không bằng cách sử dụng OBJECTPROPERTY SQL giao dịch, sử dụng 'TableHasPrimaryKey' cho đối số thứ hai.

DECLARE @ISHASPRIMARYKEY INT; 

SELECT @ISHASPRIMARYKEY = OBJECTPROPERTY(OBJECT_ID('PERSONS'), 'TABLEHASPRIMARYKEY'); 
IF @ISHASPRIMARYKEY IS NULL 
BEGIN 
    -- generate identity column 
    ALTER TABLE PERSONS 
    DROP COLUMN P_ID; 

    ALTER TABLE PERSONS 
    ADD P_ID INT IDENTITY(1,1); 

    -- add primary key 
    ALTER TABLE PERSONS 
    ADD CONSTRAINT PK_PERSONID PRIMARY KEY (P_ID); 

END; 
+1

Tôi nghĩ @ISHASPRIMARYKEY sẽ chỉ là rỗng nếu bảng Persons không tồn tại, nếu không sẽ là 0 hoặc 1 tùy thuộc vào sự tồn tại của khóa chính . – KnarfaLingus

+0

@KnarfaLingus - bạn chính xác. Tôi đã thực hiện một chỉnh sửa nhưng đại diện của tôi không đủ cao vào lúc này vì vậy tôi phải đợi nó được phê duyệt. –

2

Một IDENTITY chế không thể được thêm vào một cột hiện có, vậy làm thế nào bạn thêm này cần phải được suy nghĩ ban đầu của bạn. Có hai lựa chọn:

  1. Tạo một bảng mới bao gồm một khóa chính đậm đà bản sắc và thả các bảng hiện có
  2. Tạo một cột khóa chính mới đậm đà bản sắc và thả các cột 'P_Id' hiện

Có một cách thứ ba, đó là cách tiếp cận tốt hơn cho các bảng rất lớn thông qua tuyên bố ALTER TABLE...SWITCH. Xem Adding an IDENTITY to an existing column để biết ví dụ về từng loại. Trong câu trả lời cho câu hỏi này, nếu bảng không phải là quá lớn, tôi khuyên bạn nên chạy sau:

-- Check that the table/column exist and no primary key is already on the table. 
IF COL_LENGTH('PERSONS','P_ID') IS NOT NULL 
    AND NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
        WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = 'PERSONS') 
        -- Add table schema to the WHERE clause above e.g. AND TABLE_SCHEMA ='dbo' 
BEGIN 
    ALTER TABLE PERSONS  
    ADD P_ID_new int IDENTITY(1, 1) 
    GO 

    ALTER TABLE PERSONS 
    DROP COLUMN P_ID 
    GO 

    EXEC sp_rename 'PERSONS.P_ID_new', 'P_ID', 'Column' 
    GO 

    ALTER TABLE PERSONS 
    ADD CONSTRAINT PK_P_ID PRIMARY KEY CLUSTERED (P_ID) 
    GO 
END 

Ghi chú: Bằng cách sử dụng một cách rõ ràng từ khóa CONSTRAINT các ràng buộc khoá chính được đưa ra một tên cụ thể chứ không phải là tùy thuộc vào SQL Server để tự động gán tên.

Chỉ bao gồm CLUSTERED trên số PRIMARY KEY nếu số dư tìm kiếm cho một P_ID cụ thể và số lượng ghi lớn hơn lợi ích của việc phân cụm bảng theo một số chỉ mục khác. Xem Create SQL IDENTITY as PRIMARY KEY.

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