Tôi có hai bảng đã tồn tại mà trông (một phần) gần như thế này:Thay đổi MySQL khóa chính khi contraints chính nước ngoài tồn tại
CREATE TABLE parent (
old_pk CHAR(8) NOT NULL PRIMARY KEY
) ENGINE=InnoDB;
CREATE TABLE child (
parent_key CHAR(8),
FOREIGN KEY (parent_key) REFERENCES parent(old_pk)
ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;
Tôi muốn thêm một auto-incrementing số nguyên mới id
cột để parent
và sử dụng nó làm khóa chính thay vào đó, trong khi vẫn giữ old_pk
làm khóa duy nhất và cho phép các bảng khác như child
tham chiếu nó trong các ràng buộc khóa ngoài. Thật không may, chỉ cần nói ALTER TABLE parent DROP PRIMARY KEY
không hoạt động:
Error Code: 1025
Lỗi trên đổi tên của './data/#sql-4013_70f5e' thành './data/parent' (errno: 150)
Một số googling cho thấy điều này là do tham chiếu khóa ngoài hiện có từ child
. Về bản chất, tôi cần một cách để nói với MySQL "sử dụng cột khác này làm khóa chính, nhưng đừng quên khóa-duy nhất của bản gốc". Có cách nào để thực hiện điều này, khác hơn là chỉ thả các ràng buộc chính từ child
và phục hồi chúng sau đó?
Giả sử rằng tôi phải thay đổi các bảng tại chỗ, thay vì tạo bản sao có cùng dữ liệu và hoán đổi chúng sau này. Tôi đã thử sử dụng SET FOREIGN_KEY_CHECKS = 0
trước khi thay đổi bảng, nhưng nó dường như không giúp đỡ.
đó là lý do tại sao tôi không làm khóa chính người dùng có thể nhìn thấy (tôi là tất cả đối với khóa chính thay thế từ get-go), yêu cầu thay đổi người dùng là một nhức đầu, nhưng thật tuyệt khi biết bạn đang tạo cơ sở dữ liệu của mình sử dụng khóa chính thay thế chính http://en.wikipedia.org/wiki/Surrogate_key –