2011-12-27 37 views
25

Tôi đang sử dụng bộ dữ liệu với ruby ​​để lưu trữ dữ liệu vào các bảng nhất định.Làm cách nào để cắt bớt bảng đúng cách?

Một số bảng có lượng thông tin rất lớn và tôi muốn xóa chúng khi người dùng 'xây dựng lại cơ sở dữ liệu' (về cơ bản sẽ xóa mọi thứ và tính lại dữ liệu).

Ban đầu tôi đã thử Forum.all.destroy và đã làm nó cho tất cả các bảng khác nhau, nhưng tôi nhận thấy một số người trong số họ chỉ bị xóa khỏi trong phpmyadmin. tôi chỉ có thể tưởng tượng nó vì chìa khóa nước ngoài. Mặc dù tôi thực sự không biết vì bàn khác của tôi mà các phím foreing đã được xóa thành công. Không phải đề cập đến, id thay vì chỉ 'không' nó ra anyway để các phím không nhận được để extraordinarly số lượng lớn (như chính # 500.000).

Sau đó, tôi đã thử chạy nó với mã bên dưới, nhưng nó không xóa bảng vì 'ràng buộc khóa ngoài'. Tôi muốn ép buộc nó hoạt động vì tôi biết thực tế tôi đang xóa tất cả các bảng dựa vào nhau (tôi không chỉ xóa 2 bảng, bảng cài đặt và bảng lưu trữ ngẫu nhiên, không sử dụng bảng nào khóa ngoại).

Cho đến nay tôi có ...

adapter = DataMapper.repository(:default).adapter 
adapter.execute('TRUNCATE TABLE `forums`, `dates`, `remarks`'); 

Đó sẽ là tốt, ngoại trừ cú pháp mysql là sai rõ ràng. thats điều đầu tiên

tôi đã làm nó 1 của 1 trong phpmyadmin và khi tôi đã làm nó theo cách đó nó nói

Cannot truncate a table referenced in a foreign key constraint 

Trả lời

82

Kế hoạch A:

SET FOREIGN_KEY_CHECKS = 0; -- Disable foreign key checking. 
TRUNCATE TABLE forums; 
TRUNCATE TABLE dates; 
TRUNCATE TABLE remarks; 
SET FOREIGN_KEY_CHECKS = 1; -- Enable foreign key checking. 

Plan B:

Bạn nên cắt ngắn bảng con trước hết, sau đó là bảng cha.

Vô hiệu hóa các rủi ro kiểm tra khóa ngoài nhập hàng vào bảng của bạn không tuân thủ các ràng buộc có thể gây ra hành vi không xác định.

+0

bất kỳ ý tưởng nào về cách thực hiện điều này bằng ruby? Tôi đã thử chạy từng lệnh một cách riêng biệt trong ứng dụng và nó không xóa bất cứ điều gì. Sau đó tôi đã thử chạy từng cái một trong phpmyadmin theo thứ tự và nó vẫn nói # 1701 - Không thể cắt ngắn một bảng được tham chiếu trong một ràng buộc khóa ngoài – Tallboy

+1

làm xước! nó hoạt động ... nó chỉ ở đó trong một phần nghìn giây trước khi nó thêm dữ liệu của tôi và tôi đã không bắt nó thực sự cắt ngắn. cảm ơn! – Tallboy

+1

Tôi cắt ngắn bảng con, nhưng thậm chí sau đó nó không thành công trong khi xóa bảng cha. Dù sao, tôi đã sử dụng hack của vô hiệu hóa kiểm tra khóa nước ngoài cho bây giờ. – inquisitive

9

Thay vì sử dụng Vô hiệu hóa kiểm tra khóa ngoài.

Bạn có thể sử dụng mã bên dưới.

DELETE FROM forums; 
ALTER TABLE forums AUTO_INCREMENT = 1; 

DELETE FROM dates; 
ALTER TABLE dates AUTO_INCREMENT = 1; 

DELETE FROM remarks; 
ALTER TABLE remarks AUTO_INCREMENT = 1; 

Nó sẽ chỉ xóa tất cả các hàng và tăng id từ 1 trở đi.

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