2012-01-26 36 views
12

Tôi muốn thay đổi kiểu dữ liệu của một số cột khóa chính trong cơ sở dữ liệu của tôi từ INT thành BIGINT. Định nghĩa sau đây là một món đồ chơi-ví dụ để minh họa cho vấn đề:mysql thay đổi int cột để bigint với các phím nước ngoài

CREATE TABLE IF NOT EXISTS `owner` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `thing_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `thing_id` (`thing_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; 

DROP TABLE IF EXISTS `thing`; 
CREATE TABLE IF NOT EXISTS `thing` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; 

ALTER TABLE `owner` 
    ADD CONSTRAINT `owner_ibfk_1` FOREIGN KEY (`thing_id`) REFERENCES `thing` (`id`); 

Bây giờ khi tôi cố gắng để execut một trong các lệnh sau:

ALTER TABLE `thing` CHANGE `id` `id` BIGINT NOT NULL AUTO_INCREMENT; 
ALTER TABLE `owner` CHANGE `thing_id` `thing_id` BIGINT NOT NULL; 

tôi đang chạy vào một lỗi

#1025 - Error on rename of './debug/#[temp-name]' to './debug/[tablename]' (errno: 150) 

SHOW INODB STATUS kết quả đầu ra:

LATEST FOREIGN KEY ERROR 
------------------------ 
120126 13:34:03 Error in foreign key constraint of table debug/owner: 
there is no index in the table which would contain 
the columns as the first columns, or the data types in the 
table do not match the ones in the referenced table 
or one of the ON ... SET NULL columns is declared NOT NULL. Constraint: 
, 
CONSTRAINT "owner_ibfk_1" FOREIGN KEY ("thing_id") REFERENCES "thing" ("id") 

Tôi đoán rằng các khối định nghĩa khóa ngoài thay đổi kiểu cột ở hai bên. Cách tiếp cận ngây thơ để giải quyết vấn đề này là xóa các định nghĩa khóa ngoài, thay đổi các cột và định nghĩa lại các khóa ngoài. là có một giải pháp tốt hơn?

+1

Cách tiếp cận bạn đề cập không phải là ngây thơ, bạn thực sự có thể sử dụng nó. – Devart

+0

Cảm ơn Devart! Tôi đã tìm kiếm một giải pháp ít đau đớn vì tôi phải làm nó trên rất nhiều bảng, nhưng dường như giảm và tái tạo ràng buộc dường như là con đường để đi: - /. – deif

Trả lời

7

Ngay cả với SET foreign_key_checks = 0, bạn không thể thay đổi loại cột ràng buộc. Từ MySQL doc: http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

However, even if foreign_key_checks = 0, InnoDB does not permit the creation of a foreign key constraint where a column references a nonmatching column type.

Vì vậy, tôi đồng ý với những nhận xét của Devart. Chỉ cần thả nó và tạo lại.

+0

cũng cố gắng vô hiệu hóa kiểm tra khóa ngoài và nó không hoạt động. cảm ơn vì đã chỉ ra lý do tại sao. – deif

3

tôi có thể đề nghị bạn đổi tên các lĩnh vực như trong công cụ GUI - dbForge Studio for MySQL (phiên bản thử nghiệm miễn phí):

Chỉ cần chọn lĩnh vực bạn muốn đổi tên trong cửa sổ Database Explorer, nhấp chuột vào Refactoring-> Đổi tên lệnh, nhập mới tên trong cửa sổ đang mở và nhấn OK, nó sẽ đổi tên trường và tự động tạo lại tất cả các khóa ngoại.

0

Tôi đã có một vấn đề tương tự giải pháp là mệnh đề thay đổi:

ALTER TABLE table_name CHANGE id id BIGINT(20) NOT NULL AUTO_INCREMENT; 

Đó làm việc cho tôi.

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