2013-04-16 29 views
5

Tôi đang làm việc với mysql và codeigniter bằng cách sử dụng ORM redbean. Sau khi thực hiện một khóa ngoại cho nhiều đến nhiều assosciation tôi nhận được lỗi sau khi tôi chạy:Làm cách nào để kiểm tra các bảng được liên kết với khóa ngoài?

drop TABLE IF EXISTS `temp` 

Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails thrown 

Tôi sau đó nhập SHOW ENGINE INNODB STATUS vào phpmyadmin. Đầu ra bao gồm:

LATEST FOREIGN KEY ERROR------------------------:  Cannot drop table `db1`.`temp`because it is referenced by `db1`.`temp_workers`. 

Nói cách khác, một bảng khác tham chiếu FK. Đối với mục đích thử nghiệm, tôi nghĩ rằng điều tốt nhất cần làm là để thả tất cả các bảng liên quan và tạo lại chúng bằng cách sử dụng bộ điều khiển tôi đang thử nghiệm. Đây có phải là cách tốt nhất để đi không? Tôi đã thử:

drop TABLE IF EXISTS `temp` `temp_workers` 

, nhưng tôi vẫn nhận được lỗi ở trên và lệnh thả không hoạt động. Ngoài ra:

truncate TABLE `temp`, `temp_workers` 

cho:

You have an error in your SQL syntax 
+0

Tại sao bạn không chỉ là 'TRUNCATE'? – zerkms

+0

xem chỉnh sửa theo câu hỏi – user61629

+2

Thử giảm/cắt bớt temp_workers trước, vì nó có ràng buộc FK đối với bảng tạm thời, sau đó là bảng tạm thời. –

Trả lời

2

Như đã đề cập trong các ý kiến, bạn phải thả bất kỳ bảng với contraints FK các bảng khác, trước tiên, sau đó bạn có thể thả các bảng được liên kết đến.

Ví dụ:

User 
    id: 1 
    name: Mike 

Address 
    id: 1 
    user_id: 1 (FK constraint to User.id table.column) 
    address_1: 555 Main Street 

Thiết lập này là 1: mối quan hệ 1 (more on data normalization), nơi mà một người sử dụng hàng có thể tham khảo một dòng địa chỉ, và vì dòng địa chỉ phụ thuộc vào sự tồn tại của hàng của người dùng, nếu bạn cố xóa hàng người dùng, bạn sẽ thấy các lỗi bạn đã đề cập.

Nhưng nếu bạn thả bảng Địa chỉ trước, mọi thứ hoạt động như mong đợi vì bảng Người dùng không phải là FK cho bất kỳ bảng nào khác.

Đảm bảo referential integrity trong lược đồ của bạn đảm bảo bạn không kết thúc với các hàng mồ côi, các hàng này sẽ tràn ngập trong suốt ứng dụng hướng dữ liệu của bạn.

Bạn cũng có thể dùng các lệnh sau:

SET foreign_key_checks = 0; 
# Do Stuff 
SET foreign_key_checks = 1; 

Nhưng tôi mạnh mẽ sẽ tư vấn cho chống lại điều này, như bạn có thể phá vỡ sự toàn vẹn tham chiếu của dữ liệu của bạn, và kết thúc trong một mớ hỗn độn thật. Tôi đã nhìn thấy ai đó làm điều này trong một môi trường doanh nghiệp và phải mất vài tuần để làm sạch nó. Tuy nhiên, nếu bạn đang thực hiện điều này STRICTLY cho mục đích thử nghiệm; như viết bài kiểm tra đơn vị, hoặc chỉ học tập, và bạn không muốn thả các bảng mọi thời gian, bạn có thể làm điều này:

# Because we remove the foreign key check, we can truncate in any order 
SET foreign_key_checks = 0; 
TRUNCATE TABLE user; 
TRUNCATE TABLE address; 
SET foreign_key_checks = 1; 

schema thiết kế đúng cách sử dụng ràng buộc khoá ngoại đi dọc theo con đường để xây dựng một nền tảng tốt cho bất kỳ ứng dụng điều khiển dữ liệu nào. Nó sẽ mất thời gian để có được đầu của bạn xung quanh khi sử dụng, và làm thế nào để xây dựng những khó khăn chính nước ngoài, nhưng theo thời gian, bạn sẽ bắt đầu hiểu. Một cách hay để bắt đầu là tải xuống dự án nguồn mở như magento, wordpress hoặc vbulletin và xem xét các lược đồ của chúng. Bạn thậm chí có thể quan sát các lược đồ này bằng cách sử dụng MySQL workbench và xem Entity-Relationship Diagrams (ERDs) của chúng, sẽ minh họa trực quan các liên kết giữa các bảng.

+0

Cảm ơn, một câu trả lời tuyệt vời! – user61629

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