Cách tốt để thêm KHÓA CHÍNH vào bảng InnoDB lớn là gì?


8

Tôi có một bảng với khoảng 30 triệu hàng trong MySQL 5.5 bằng cách sử dụng công cụ lưu trữ InnoDB. Bảng này có khóa ngoại liên kết với bảng khác với khoảng 3 triệu hàng.

Tôi muốn thêm khóa chính vào bảng lớn hơn, nhưng không chắc chắn cách tốt nhất để thực hiện điều này. Không có cột nào hiện có (hoặc bộ cột) tôi có thể sử dụng cho mục này, vậy tôi nên làm thế nào về điều này?

Tôi đã thấy một số tài liệu tham khảo đến ID hồ sơ InnoDB nội bộ, nhưng không tìm thấy nếu điều này có thể truy cập được.

Nếu không, có lẽ tôi sẽ cần phải kết xuất và tải lại dữ liệu, thêm id vào thủ công.

Cảm ơn.


Là sự kết hợp của các phím trong bảng là độc nhất tự nhiên? Nếu vậy, khóa chính nhiều cột có thể có ý nghĩa.
Justin thân mến

Thật không may, không có khóa tổng hợp như vậy có thể. Nếu không, tôi đồng ý rằng sẽ có ý nghĩa. Tôi đã chỉnh sửa bài đăng để làm rõ rằng điều này là không thể.
Wodin

Câu trả lời:


7

đây có thể là cách sai để đi về nó, nhưng ..

bạn không thể thay đổi cấu trúc bảng,

thêm một cột khóa chính vào bảng

sau đó...

viết một kịch bản nhanh chóng để đi qua toàn bộ bảng

thêm một giá trị tự động vào cột mới?


2
Cám ơn vì sự gợi ý. Tôi nghĩ rằng tôi sẽ phải thêm cột dưới dạng khóa không phải là khóa chính và sau đó chuyển đổi nó thành khóa chính, nhưng tôi thực sự đã vô tình phát hiện ra khi kiểm tra trên một bảng nhỏ, đó là thêm cột AUTO_INCREMENT (làm khóa chính) tự động điền vào ids. Đã cho rằng nó sẽ chỉ cho tôi một lỗi, vì vậy tôi nghĩ đó là câu trả lời.
Wodin

nếu cơ sở dữ liệu được sử dụng nhiều, bạn có thể muốn kiểm tra điều này trên một bảng không văn bản để đảm bảo rằng nó không khóa nó trong một thời gian dài
Patrick

@Patrick, cảm ơn bạn đã lưu ý. Cơ sở dữ liệu hiện không được sử dụng và tôi hoàn toàn mong đợi điều này sẽ khóa bảng trong một thời gian dài.
Wodin

1
Tôi đã làm ALTER TABLE blah ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY;và mất 2 giờ 18 phút :) Tôi đã không thử viết lên bàn trong thời gian đó, nhưng đọc vẫn hoạt động tốt.
Wodin

1
@Wodin wow, đó là một thời gian dài cho một lệnh bảng thay đổi. mừng vì việc này giúp ích được cho bạn.
Patrick

3

Đây là cách tôi sẽ tiếp cận điều này:

  1. Tạo một bảng mới với cấu trúc mong muốn bao gồm KEY PRIMARY KEY của bạn w / AUTO_INCREMENT và có thể là một trường được lập chỉ mục khác.
  2. Hãy dừng lại để dừng tất cả lưu lượng.
  3. Xác nhận bạn có một bản sao lưu hợp pháp dữ liệu của bạn.
  4. Sao chép tất cả các hàng của bạn từ bảng hiện có của bạn vào bảng mục tiêu tận dụng TĂNG TỐC TỰ ĐỘNG để tạo id của bạn. * ví dụ: CHỌN VÀO target_table (col1, col2, v.v.) CHỌN (col1, col2, v.v.) TỪ origin_table; *
  5. Kiểm tra rằng dữ liệu trong bảng mới là chính xác.
  6. RENAME bảng cũ thành origin_table_BAK.
  7. RENAME target_table thành origin_table.
  8. Khói kiểm tra ứng dụng của bạn.
  9. Mở lại giao thông.
  10. Sau lần sao lưu tiếp theo của bạn, hãy bỏ origin_table_BAK.

* Lưu ý: Nếu bảng gốc là InnoDB, các ràng buộc khóa ngoại sẽ được duy trì và tồn tại khi đổi tên. Vì vậy, bạn sẽ phải làm một thay đổi để khắc phục điều đó.


3
Nếu bạn cần thực hiện trực tiếp, hãy thực hiện các bước 6 và 7 trong một RENAME duy nhất, từ đó biến nó thành nguyên tử. RENAME BẢNG real_name TO cũ, mới TO real_name;
Rick James
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.