Làm cách nào để thay đổi ràng buộc khóa chính bằng cú pháp SQL?


100

Tôi có một bảng bị thiếu một cột trong ràng buộc khóa chính của nó. Thay vì chỉnh sửa nó thông qua SQL Server, tôi muốn đặt nó trong một tập lệnh để thêm nó như một phần của các tập lệnh cập nhật của chúng tôi.

Tôi có thể sử dụng cú pháp nào để thực hiện việc này? Tôi có phải bỏ và tạo lại ràng buộc khóa không?


5
AFAIK có, bạn cần thả và tạo lại ràng buộc PK. Tôi không nhớ bất kỳ lệnh nào để thêm cột vào ràng buộc PK / FK đã tồn tại.
Seramme

Câu trả lời:


149

Đúng. Cách duy nhất là loại bỏ ràng buộc bằng một bảng Alter, sau đó tạo lại nó.

ALTER TABLE <Table_Name>
DROP CONSTRAINT <constraint_name>

ALTER TABLE <Table_Name>
ADD CONSTRAINT <constraint_name> PRIMARY KEY (<Column1>,<Column2>)

11
Nếu bạn không biết tên ràng buộc khóa chính, hãy sử dụng truy vấn tìm thấy ở đây để tra cứu (hoặc tra cứu và thả tất cả cùng một lúc). http://stackoverflow.com/a/13948609/945875
Justin

nếu nó không được rõ ràng, hoặc bất cứ ai khác làm cho những sai lầm tương tự, tên hạn chế không thể đi trong dấu ngoặc kép alter table PatientsInfo drop constraint PK__Patients__1CBB51380A338187được làm việc ở đây
Maslow

1
Đối với những bạn chưa biết tên ràng buộc: ALTER TABLE db. table DROP PRIMARY KEY, ADD PRIMARY KEY ( id1, id2);
karsten314159 13/12/18

21

PRIMARY KEY CONSTRAINTkhông thể thay đổi, bạn chỉ có thể thả nó và tạo lại. Đối với các bộ dữ liệu lớn, nó có thể gây ra một thời gian dài và do đó - bảng không khả dụng.


3

Hiệu suất khôn ngoan là không có lý do gì để giữ các chỉ mục không phân cụm trong quá trình này vì chúng sẽ được cập nhật lại khi thả và tạo. Nếu đó là một tập dữ liệu lớn, bạn nên cân nhắc đổi tên bảng (nếu có thể, có cài đặt bảo mật nào trên đó không?), Tạo lại một bảng trống với các khóa chính xác sẽ di chuyển tất cả dữ liệu vào đó. Bạn phải chắc chắn rằng bạn có đủ không gian cho việc này.


3

Trong trường hợp của tôi, tôi muốn thêm một cột vào Khóa chính (cột 4). Tôi đã sử dụng tập lệnh này để thêm cột4

ALTER TABLE TableA
DROP CONSTRAINT [PK_TableA]

ALTER TABLE TableA
ADD CONSTRAINT [PK_TableA] PRIMARY KEY (
    [column1] ASC,
    [column2] ASC, 
    [column3] ASC,
    [column4] ASC
)

-4

bạn có thể đổi tên các đối tượng ràng buộc bằng sp_rename (như được mô tả trong câu trả lời này )

ví dụ:

EXEC sp_rename N'schema.MyIOldConstraint', N'MyNewConstraint'

3
Câu hỏi đặt ra là làm thế nào để thay đổi ràng buộc, tức là THÊM một cột chứ không phải cách đổi tên.
Andrew Steitz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.