2010-07-29 31 views

Trả lời

122

Cũ câu hỏi nhưng thêm câu trả lời để người ta có thể nhận giúp

quá trình hai bước của nó:

Giả sử, một table1khóa ngoại có tên cột fk_table2_id, với ràng buộc tên fk_nametable2 được gọi bảng có khóa t2 (một cái gì đó như dưới đây trong sơ đồ của tôi).

table1 [ fk_table2_id ] --> table2 [t2] 

Bước đầu tiên, thả CONSTRAINT cũ: (reference)

ALTER TABLE `table1` 
DROP FOREIGN KEY `fk_name`; 

thông báo hạn chế này sẽ bị xóa, cột sẽ không bị xóa

Thứ hai bước, ADD mới CONSTRAINT:

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 đã có

Ví dụ:

Tôi có một bảng UserDetails đề cập đế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 
: 
+1

Cảm ơn, câu hỏi cũ nhưng bạn là đúng, câu trả lời khác là một chút khó hiểu cho tôi trở lại trong ngày. – Moak

+0

cũng nhờ bạn :) –

+1

Không nên hạn chế bạn thêm vào BẬT TỪ XÓA theo yêu cầu của câu hỏi gốc? – Noumenon

10
ALTER TABLE DROP FOREIGN KEY fk_name; 
ALTER TABLE ADD FOREIGN KEY fk_name(fk_cols) 
      REFERENCES tbl_name(pk_names) ON DELETE RESTRICT; 
+0

fk_name là tên cột? – Moak

+2

đã giúp tôi tìm giải pháp 'ALTER TABLE table_name ADD' ...' ON DELETE RESTRICT' – Moak

+2

Không, fk_name là tên hạn chế. Đó là tùy chọn để cung cấp. Tôi không chắc chắn nhưng có thể bạn có thể truy xuất nó bằng cách sử dụng 'SHOW CREATE TABLE'. – pascal

9

Bạn có thể làm điều này trong một truy vấn nếu bạn sẵn sàng để thay đổ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 chiếc bàn lớn.

3

Hãy nhớ rằng MySQL giữ một chỉ mục đơn giản trên một cột sau khi xóa khóa ngoại.Vì vậy, nếu bạn cần thay đổi cột 'tài liệu tham khảo' bạn nên làm điều đó trong 3 bước

  • thả ban đầu FK
  • thả một chỉ số (tên như fk trước, sử dụng drop index khoản)
  • tạo mới FK
3

Bạn chỉ có thể sử dụng một truy vấn để cai 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

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