Thêm cột mới với ràng buộc khóa ngoài trong một lệnh


128

Tôi đang cố gắng thêm một cột mới sẽ là một khóa ngoại. Tôi đã có thể thêm cột và ràng buộc khóa ngoài bằng hai ALTER TABLElệnh riêng biệt :

ALTER TABLE one
ADD two_id integer;

ALTER TABLE one
ADD FOREIGN KEY (two_id) REFERENCES two(id);

Có cách nào để làm điều này với một lệnh ALTER TABLE thay vì hai không? Tôi không thể đưa ra bất cứ điều gì hoạt động.


Câu trả lời:


185

Như thường lệ với câu hỏi liên quan đến SQL, nó phụ thuộc vào DBMS. Một số DBMS cho phép bạn kết hợp các hoạt động bảng ALTER được phân tách bằng dấu phẩy. Ví dụ...

Informix cú pháp:

ALTER TABLE one
    ADD two_id INTEGER,
    ADD CONSTRAINT FOREIGN KEY(two_id) REFERENCES two(id);

Cú pháp cho IBM DB2 LUW cũng tương tự, lặp lại từ khóa ADD nhưng (nếu tôi đọc sơ đồ chính xác) không yêu cầu dấu phẩy để phân tách các mục đã thêm.

Cú pháp Microsoft SQL Server :

ALTER TABLE one
    ADD two_id INTEGER,
    FOREIGN KEY(two_id) REFERENCES two(id);

Một số người khác không cho phép bạn kết hợp các hoạt động ALTER TABLE như thế. SQL chuẩn chỉ cho phép một thao tác duy nhất trong câu lệnh ALTER TABLE, vì vậy, trong SQL chuẩn, nó phải được thực hiện theo hai bước.


5
Thêm và ràng buộc thứ hai.
Imran

18
Đối với phần SQL, để đặt tên cho ràng buộc, bạn viết nó như sau: ALTER TABLE [Tin nhắn] ADD [AlertTriggerID] BIGINT NULL, CONSTRAINT FK_Messages_AlertTriggers FOREIGN KEY (AlertTriggerID) TÀI LIỆU THAM KHẢO
Dragos Durlut

78

Trong MS-SQLServer:

ALTER TABLE one
ADD two_id integer CONSTRAINT fk FOREIGN KEY (two_id) REFERENCES two(id)

cho động cơ DB này là gì?
knocte

@knocte nó dành cho máy chủ ms sql - câu hỏi hiện được gắn thẻ để làm rõ điều đó
sqladmin

Tôi không nghĩ câu hỏi cần làm rõ, vì câu trả lời được chấp nhận đã nói rằng có một sự khác biệt lớn giữa các công cụ DB trong cách thực hiện, điều cần làm rõ là câu trả lời của bạn, vì vậy tôi mới làm điều đó
knocte

9
Lên để đặt tên cho ràng buộc của bạn. Câu trả lời được chấp nhận cho phép hệ thống tạo ra tên, rất khó và khó quản lý sau này.
Derpy

17

Đối với SQL Server, nó phải giống như

ALTER TABLE one
ADD two_id integer constraint fk foreign key references two(id)

1
Đây là một chút ngắn gọn hơn so với các câu trả lời khác.
Sam

11

Trong MS SQL SERVER:

Với tên người dùng được xác định tên nước ngoài

ALTER TABLE tableName
ADD columnName dataType,
CONSTRAINT fkName FOREIGN KEY(fkColumnName) 
   REFERENCES pkTableName(pkTableColumnName);

Không có người dùng xác định tên khóa ngoại

ALTER TABLE tableName
ADD columnName dataType,
FOREIGN KEY(fkColumnName) REFERENCES pkTableName(pkTableColumnName);

3

Trong Oracle :

ALTER TABLE one ADD two_id INTEGER CONSTRAINT Fk_two_id REFERENCES two(id);

2

Cập nhật 2020

Đó là câu hỏi khá cũ nhưng mọi người vẫn quay lại với nó. Trong trường hợp các câu trả lời trên không giúp ích gì cho bạn, hãy đảm bảo rằng bạn đang sử dụng cùng loại dữ liệu cho cột mới làm id của bảng khác.

Trong trường hợp của tôi, tôi đã sử dụng Laravel và tôi sử dụng "số nguyên không dấu" cho tất cả các id của mình vì không có điểm nào có id id âm LOL.

Vì vậy, truy vấn SQL thô sẽ thay đổi như sau:

ALTER TABLE `table_name`
ADD `column_name` INTEGER UNSIGNED,
ADD CONSTRAINT constrain_name FOREIGN KEY(column_name) REFERENCES foreign_table_name(id);

Tôi hy vọng nó sẽ giúp


1
"THÊM CONSTRAINT" chỉ nên là "CONSTRAINT", đúng chứ?
TimH

1

Bạn có thể làm như dưới đây trong SQL Server

ALTER TABLE one
ADD two_id int foreign key
REFERENCES two(id)


1

ALTER TABLE TableName ADD NewColumnName INTEGER, FOREIGN KEY(NewColumnName) REFERENCES [ForeignKey_TableName](Foreign_Key_Column)


1

Đối với DB2, cú pháp là:

ALTER TABLE one ADD two_id INTEGER FOREIGN KEY (two_id) REFERENCES two (id);

0

Nếu bạn cũng cần thêm các giá trị mặc định trong trường hợp bạn đã có một số hàng trong bảng thì hãy thêm DEFAULT val

ALTER TABLE one
ADD two_id int DEFAULT 123,
FOREIGN KEY(two_id) REFERENCES two(id);

0

Thử cái này:

ALTER TABLE product
ADD FOREIGN KEY (product_ID) REFERENCES product(product_ID);

1
Chào mừng đến với SO! Xin vui lòng, nhận xét câu trả lời của bạn khi họ chỉ là mã. Trong trường hợp của bạn, có nhiều câu trả lời khá giống với câu trả lời của bạn, vì vậy hãy phơi bày những lợi ích của bạn.
David García Bodego
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.