2013-04-11 39 views
32

Tôi có tập lệnh sao lưu cho cơ sở dữ liệu MySQL của mình, sử dụng mysqldump với tùy chọn --tab để nó tạo tệp .sql cho cấu trúc và tệp .txt (phân cách bằng ống) cho nội dung.Vô hiệu hóa kiểm tra khóa ngoài trên dòng lệnh

Một số bảng có phím nước ngoài, vì vậy khi tôi nhập nó tôi nhận được lỗi:

ERROR 1217 (23000) at line 8: Cannot delete or update a parent row: a foreign key constraint fails

tôi biết về việc sử dụng SET FOREIGN_KEY_CHECKS=0 (và SET FOREIGN_KEY_CHECKS=1 sau đó). Nếu tôi thêm chúng vào mỗi tệp .sql thì quá trình nhập sẽ hoạt động. Nhưng sau đó hiển nhiên trên mysqldump những người bị ghi đè.

Tôi cũng đã cố gắng chạy nó như một lệnh riêng biệt, như dưới đây nhưng lỗi trở lại:

echo "SET FOREIGN_KEY_CHECKS=0" | mysql [user/pass/database] 
[all the imports] 
echo "SET FOREIGN_KEY_CHECKS=1" | mysql [user/pass/database] 

Có một số cách khác để vô hiệu hóa kiểm tra FK trên dòng lệnh?

Trả lời

56

Bạn có thể thực hiện việc này bằng cách nối chuỗi vào tệp nội tuyến. Tôi chắc rằng có một cách dễ dàng hơn để nối chuỗi và tệp, nhưng nó hoạt động.

cat <(echo "SET FOREIGN_KEY_CHECKS=0;") imports.sql | mysql 

Tôi không nghĩ bạn cần đặt trở lại 1 vì chỉ là một phiên.

+0

này trông giống như cách tốt nhất. Thật đáng ngạc nhiên 'mysqldump' không có tùy chọn' --disable-foreign-keys'. – Barmar

+2

@Barar nhớ rằng các khóa ngoại là một sản phẩm của động cơ InnoDB hơn là bản thân MySQL –

+0

Cảm ơn, điều đó đang hoạt động! Vì vậy, thiết lập FK kiểm tra chỉ hoạt động cho một lệnh, chứ không phải là sự bền bỉ trên nhiều lệnh? – DisgruntledGoat

12

Chỉ cần một số khác cũng làm như vậy:

{ echo "SET FOREIGN_KEY_CHECKS=0;" ; cat imports.sql ; } | mysql 
+0

Cảm ơn, điều này là hoàn hảo vì tôi đã 'zcat'ing tệp khác của tôi. –

43

Bạn cũng có thể sử dụng --init-command tham số của mysql lệnh.

tức là .: mysql --init-command="SET SESSION FOREIGN_KEY_CHECKS=0;" ...

MySQL 5.5 Documentation - mysql options

+3

Đây là giải pháp tốt nhất, tốt hơn câu trả lời của "Thuốc nổ" – chris342423

+0

tôi đã cố gắng như: mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0;" -u root -p DBname và tôi nhận được Bạn có một lỗi trong cú pháp SQL của bạn; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn cho cú pháp đúng để sử dụng gần 'mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0;" -u root -p DBName 'tại dòng 1 –

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