Làm cách nào để thêm một cột và biến nó thành một khóa ngoại trong một câu lệnh MySQL?


81

Trong mysql, tôi có thể thêm một cột và khóa ngoại trong cùng một câu lệnh không? Và cú pháp thích hợp để thêm fk là gì?

Đây là SQL của tôi:

ALTER TABLE database.table
 ADD COLUMN columnname INT DEFAULT(1),
 FOREIGN KEY (fk_name) REFERENCES reftable(refcolumn) ON DELETE CASCADE;

... và thông báo lỗi kèm theo:

Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn sử dụng tương ứng với phiên bản máy chủ MySQL của bạn để biết cú pháp phù hợp để sử dụng gần 'FOREIGN KEY (fk_name) TÀI LIỆU THAM KHẢO có thể sử dụng lại (refcolumn) ON DELETE CASCADE' tại dòng 4

Câu trả lời:


96

Thử đi:

ALTER TABLE database.table
  ADD COLUMN columnname INT DEFAULT(1),
  ADD FOREIGN KEY fk_name(fk_column) REFERENCES reftable(refcolumn) ON DELETE CASCADE;

6
Và cho fk_namefk_columntôi phải chèn whaat ...?
C4d

7
@ C4ud3x fk_namesẽ là tên mà bạn muốn đặt cho ràng buộc cụ thể này nhằm mục đích nhận dạng (tùy chọn trong truy vấn) mysql sẽ tự động tạo nó và fk_columnlà cột tham chiếu bạn muốn hoạt động như khóa ngoại.
Rabia Naz khan

1
Tôi khuyên mọi người nên chỉ định rõ ràng tên ràng buộc. Các vấn đề khó khăn có thể tìm đến bạn nếu bạn muốn xóa cột đó trong tương lai và hệ thống của bạn đã chạy trong các db khác nhau có các ý tưởng khác nhau về cách tự động đặt tên cho các ràng buộc (ví dụ: mariaDB vs mySQL). Tôi muốn dành một dòng mã này và không chỉ định ràng buộc, như ở đây. Vài tháng sau khi tôi phải trả giá bằng cách cố gắng viết một chuyển đổi sẽ xóa cột trong tất cả các hệ thống. stackoverflow.com/questions/55374835/…
Alkis Mavridis

37

Truy vấn sau đây thêm một cột bằng cách thay đổi truy vấn và truy vấn ràng buộc làm cho nó trở thành FK trong một truy vấn mysql duy nhất. Bạn có thể làm điều đó như thế này,

TỔNG HỢP:

ALTER TABLE `SCHEMANAME`.`TABLE1` 
ADD COLUMN `FK_COLUMN` BIGINT(20) NOT NULL, 
ADD CONSTRAINT `FK_TABLE2_COLUMN` FOREIGN KEY (`FK_COLUMN`) 
REFERENCES `SCHEMANAME`.`TABLE2`(`PK_COLUMN`);

THÍ DỤ:

ALTER TABLE `USERDB`.`ADDRESS_TABLE` 
ADD COLUMN `USER_ID` BIGINT(20) NOT NULL AFTER `PHONE_NUMBER`, 
ADD CONSTRAINT `FK_CUSTOMER_TABLE_CUSTOMER_ID` FOREIGN KEY (`USER_ID`) 
REFERENCES `USERDB`.`CUSTOMER_TABLE`(`CUSTOMER_ID`); 

2

Điều này có thể được đơn giản hóa một chút. Bạn chỉ cần thêm từ khóa "THÊM" trước "TỪ KHÓA NGOẠI TỆ". Thêm ví dụ bên dưới.

ALTER TABLE database.table
ADD COLUMN columnname INT DEFAULT(1),
ADD FOREIGN KEY (fk_name) REFERENCES reftable(refcolumn) ON DELETE CASCADE;

-3

Bạn co thể sử dụng no.

ALTER TABLE database.table
ADD COLUMN columnname INT DEFAULT(1);
ALTER TABLE database.table add FOREIGN KEY (fk_name) REFERENCES reftable(refcolumn) ON DELETE CASCADE;
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.