Câu trả lời:
Câu hỏi cũ nhưng thêm câu trả lời để một người có thể nhận được trợ giúp
Quy trình hai bước của nó:
Giả sử, a table1
có một khóa ngoại với tên cột fk_table2_id
, với tên ràng buộcfk_name
và table2
được gọi là bảng có khóa t2
( giống như dưới đây trong sơ đồ của tôi ).
table1 [ fk_table2_id ] --> table2 [t2]
Bước đầu tiên , DROP CONSTRAINT cũ: ( tham khảo )
ALTER TABLE `table1`
DROP FOREIGN KEY `fk_name`;
thông báo ràng buộc bị xóa, cột không bị xóa
Bước thứ hai , THÊM CONSTRAINT mới:
ALTER TABLE `table1`
ADD CONSTRAINT `fk_name`
FOREIGN KEY (`fk_table2_id`) REFERENCES `table2` (`t2`) ON DELETE CASCADE;
thêm ràng buộc, cột đã ở đó
Thí dụ:
Tôi có một UserDetails
bảng tham chiếu đến Users
bảng:
mysql> SHOW CREATE TABLE UserDetails;
:
:
`User_id` int(11) DEFAULT NULL,
PRIMARY KEY (`Detail_id`),
KEY `FK_User_id` (`User_id`),
CONSTRAINT `FK_User_id` FOREIGN KEY (`User_id`) REFERENCES `Users` (`User_id`)
:
:
Bước đầu tiên:
mysql> ALTER TABLE `UserDetails` DROP FOREIGN KEY `FK_User_id`;
Query OK, 1 row affected (0.07 sec)
Bước thứ hai:
mysql> ALTER TABLE `UserDetails` ADD CONSTRAINT `FK_User_id`
-> FOREIGN KEY (`User_id`) REFERENCES `Users` (`User_id`) ON DELETE CASCADE;
Query OK, 1 row affected (0.02 sec)
kết quả:
mysql> SHOW CREATE TABLE UserDetails;
:
:
`User_id` int(11) DEFAULT NULL,
PRIMARY KEY (`Detail_id`),
KEY `FK_User_id` (`User_id`),
CONSTRAINT `FK_User_id` FOREIGN KEY (`User_id`) REFERENCES
`Users` (`User_id`) ON DELETE CASCADE
:
Bạn có thể thực hiện điều này trong một truy vấn nếu bạn muốn đổi tên của nó:
ALTER TABLE table_name
DROP FOREIGN KEY `fk_name`,
ADD CONSTRAINT `fk_name2` FOREIGN KEY (`remote_id`)
REFERENCES `other_table` (`id`)
ON DELETE CASCADE;
Điều này rất hữu ích để giảm thiểu thời gian chết nếu bạn có một bàn lớn.
ALTER TABLE DROP FOREIGN KEY fk_name;
ALTER TABLE ADD FOREIGN KEY fk_name(fk_cols)
REFERENCES tbl_name(pk_names) ON DELETE RESTRICT;
ALTER TABLE table_name ADD
...ON DELETE RESTRICT
SHOW CREATE TABLE
.
Bạn có thể chỉ cần sử dụng một truy vấn để thống trị tất cả:
ALTER TABLE products
DROP FOREIGN KEY oldConstraintName,
ADD FOREIGN KEY (product_id, category_id) REFERENCES externalTableName (foreign_key_name, another_one_makes_composite_key) ON DELETE CASCADE ON UPDATE CASCADE
Tôi có một loạt các FK để thay đổi, vì vậy tôi đã viết một cái gì đó để đưa ra các tuyên bố cho tôi. Hình tôi sẽ chia sẻ:
SELECT
CONCAT('ALTER TABLE `' ,rc.TABLE_NAME,
'` DROP FOREIGN KEY `' ,rc.CONSTRAINT_NAME,'`;')
, CONCAT('ALTER TABLE `' ,rc.TABLE_NAME,
'` ADD CONSTRAINT `' ,rc.CONSTRAINT_NAME ,'` FOREIGN KEY (`',kcu.COLUMN_NAME,
'`) REFERENCES `',kcu.REFERENCED_TABLE_NAME,'` (`',kcu.REFERENCED_COLUMN_NAME,'`) ON DELETE CASCADE;')
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
ON kcu.TABLE_SCHEMA = rc.CONSTRAINT_SCHEMA
AND kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
WHERE DELETE_RULE = 'NO ACTION'
AND rc.CONSTRAINT_SCHEMA = 'foo'