2010-03-12 31 views
31

Khi tôi chạy lệnh mysqldump trên cơ sở dữ liệu của mình và sau đó thử nhập nó, nó không thành công vì nó cố tạo bảng theo thứ tự bảng chữ cái, mặc dù chúng có thể có khóa ngoài tham chiếu bảng sau này trong tệp. Dường như không có bất cứ điều gì trong documentation và tôi đã tìm thấy câu trả lời như this mà nói để cập nhật các tập tin sau khi nó được tạo ra để bao gồm:Bạn có thể tự động tạo tệp mysqldump không thực thi ràng buộc khoá ngoại không?

set FOREIGN_KEY_CHECKS = 0; 
...original mysqldump file contents... 
set FOREIGN_KEY_CHECKS = 1; 

Có không có cách nào để tự động thiết lập những đường dây hoặc xuất bảng theo thứ tự cần thiết (mà không cần phải chỉ định tất cả các tên bảng theo cách thủ công vì có thể bị tẻ nhạt và dễ bị lỗi)? Tôi có thể bọc những dòng này trong một kịch bản, nhưng đã tự hỏi nếu có một cách dễ dàng để đảm bảo tôi có thể đổ một tập tin và sau đó nhập khẩu nó mà không cần cập nhật bằng tay nó.

Trả lời

39

Lệnh mysqldump đi kèm với MySQL 5.0.51 (và theo các phiên bản nhật ký thay đổi kể từ 4.1.1) sẽ tắt kiểm tra khóa ngoài. Theo mặc định, mysqldump bao gồm các dòng sau ở phía trên cùng của tập tin dump:

/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 

Cú pháp /*!40014 ... */ là một conditional comment sẽ được thực hiện trên MySQL 4.0.14 và sau đó. Cài đặt kiểm tra khóa ngoài cũ được khôi phục ở cuối tệp kết xuất:

/*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */; 
+2

Có, tôi thấy điều đó trong tệp. Một người khác đang cố gắng nhập tệp này đang gặp phải lỗi trên dòng khóa ngoài và nghĩ rằng đó là do thứ tự tạo. –

+5

Làm cách nào để trả lời câu hỏi này? Tai đã nói rằng anh ấy đang gặp lỗi VỚI những nhận xét này trong tệp, vậy vấn đề đã được giải quyết như thế nào? – JoeTidee

26

Cẩn thận. Vì một số lý do mysqldump không viết FOREIGN_KEY_CHECKS = 0 nếu tùy chọn --compact được sử dụng.

Bưu.

+3

Lý do là '--compact' bao gồm' --skip-comments' vì vậy thay vào đó '--compact' nên sử dụng' --skip-add-drop-table --skip-add-locks --skip-disable -key --skip-set-charset' – iRonin

+2

Bạn thực sự cũng có thể - nhận xét -pip. Hướng dẫn nói rằng --compact "cho phép --skip-add-drop-table, --skip-add-locks, --skip-comments, --skip-disable-keys và --skip-set tùy chọn -charset ", nhưng rõ ràng --compact cũng loại bỏ một số đầu ra khác ngoài điều đó - ví dụ như câu lệnh FOREIGN_KEY_CHECKS. – dpi

9

Nếu bạn đang sử dụng phpMyAdmin khi xuất SQL, hãy chọn Phương thức xuất tùy chỉnh. Sau đó, trong số các tùy chọn hộp kiểm, hãy nhấp vào "Vô hiệu hóa kiểm tra khóa ngoài". Câu lệnh SQL được xuất khẩu sẽ có vô hiệu hóa và cho phép kiểm tra khóa ngoài ở đầu và cuối của tệp đầu ra tương ứng.

Nó không phải là "tự động", nhưng bạn sẽ không phải tự mình viết báo cáo cho mỗi lần xuất.

+0

Thật tuyệt vời! Một cuộc bỏ phiếu cho việc đề xuất giải pháp thay thế hoạt động dễ dàng hơn nhiều so với yêu cầu – alds

+3

Đó là vì "dễ dàng hơn nhiều" cực kỳ chủ quan (tôi hoàn toàn không hữu ích, ví dụ) và nó không thực sự trả lời câu hỏi. – sehe

+2

+1 chắc chắn hữu ích cho người dùng PhpMyAdmin.Mọi người khác có thể chủ quan bỏ qua nó, hoặc cực kỳ chủ quan downvote nó :) – chim

6

Điều này có thể xảy ra nếu bạn sử dụng --compact làm một trong các lệnh mysqldump của mình. --compact bao gồm --skip-comments để thay thế --compact bạn nên sử dụng --skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset

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