Tôi muốn xóa tất cả các bảng khỏi cơ sở dữ liệu, nhưng không xóa chính cơ sở dữ liệu đó. Có thể không? Tôi chỉ tìm cách ngắn hơn loại bỏ cơ sở dữ liệu và tạo lại nó. Cảm ơn !Làm thế nào để thả tất cả các bảng trong cơ sở dữ liệu mà không làm rơi cơ sở dữ liệu?
Trả lời
Ngắn nhất là tạo lại cơ sở dữ liệu. nhưng nếu bạn không muốn ...
Đây là dành cho MySQL/PHP. Không được thử nghiệm nhưng một cái gì đó như thế.
$mysqli = new mysqli("host", "my_user", "my_password", "database");
$mysqli->query('SET foreign_key_checks = 0');
if ($result = $mysqli->query("SHOW TABLES"))
{
while($row = $result->fetch_array(MYSQLI_NUM))
{
$mysqli->query('DROP TABLE IF EXISTS '.$row[0]);
}
}
$mysqli->query('SET foreign_key_checks = 1');
$mysqli->close();
Không có cách nào đơn giản để thực hiện việc này. Hoặc là bạn sẽ cần phải biết những gì các bảng là trước:
// chỉnh sửa bạn có thể nhận thông tin này bằng cách sử dụng truy vấn SHOW TABLE STATUS
$tables = array('users','otherdata');
foreach($tables as $table){
db.execute("DROP TABLE "+$table);
}
hoặc bạn có thể thả cơ sở dữ liệu và tái tạo nó rỗng (nó thực sự không phải là nhiều công sức):
db.execute('DROP DATABASE SITEDATA');
db.execute('CREATE DATABASE SITEDATA');
Nếu có những thứ khác trong cơ sở dữ liệu (Stored Procedure, Chức năng, và tài khoản Quyền liên quan với những thứ này) việc bỏ cơ sở dữ liệu có thể không phải là thứ mà OP muốn. –
Như fredley nói, nếu bạn không cần bất cứ điều gì, nhưng cơ sở dữ liệu rỗng chỉ cần thả nó và tạo lại nó. – Chris
Nếu bạn không thể thực hiện DROP/CREATE, phương pháp đầu tiên là cách duy nhất, bạn không thể thả tất cả các bảng trong một lệnh. – fredley
Bạn sẽ phải thả tất cả các bảng trong db riêng, vì vậy thả các cơ sở dữ liệu và tái tạo nó sẽ thực sự là con đường ngắn nhất (và một trong những nhanh nhất cho rằng vấn đề).
Khi tôi phải làm điều này trong Oracle, tôi sẽ viết một câu lệnh chọn để tạo ra các câu lệnh bảng thả cho tôi. Nội dung nào đó có hiệu lực của:
Chọn 'DROP TABLE' || table_name || ';' từ user_tables;
Sau đó tôi có thể đưa đầu ra của câu lệnh chọn vào một tệp. Sau khi tôi chạy điều này, tôi sẽ có một tập tin mà sẽ thả tất cả các bảng của tôi cho tôi. Nó sẽ trông giống như sau:
DROP TABLE TABLE1;
DROP TABLE TABLE2;
DROP TABLE TABLE3;
vv ...
Không phải là một chuyên gia mysql, nhưng tôi sẽ tưởng tượng nó sẽ có một cơ sở tương tự cho cả hai chọn tất cả các bảng cho một lược đồ, cũng như đầu ra trực tiếp từ một câu lệnh SQL vào một tập tin.
Bạn có thể phải áp dụng nhiều lần một tập lệnh như vậy vì sự hiện diện của các ràng buộc khóa ngoài có thể ngăn không cho các bảng bị loại bỏ. –
Tuyệt đối. Nó có thể mất vài lần. –
Hmm, không nhất thiết. Nếu bạn xóa tất cả các bảng trong một giao dịch, bạn có thể trì hoãn việc kiểm tra ràng buộc ('SET CONSTRAINTS ALL DEFERRED;') - trong Oracle. Trong MySQL bạn có thể tạm thời vô hiệu hóa các kiểm tra khóa ngoài (như trong giải pháp của tôi - 'SET foreign_key_checks = 0;') Điều này có thể ít nhất là giảm số pha cần thiết. –
Sử dụng SHOW TABLE STATUS
để nhận tất cả các bảng trong cơ sở dữ liệu của bạn, sau đó lặp lại kết quả và thả từng cái một.
Có một số giải pháp ở đây trong ý kiến: http://dev.mysql.com/doc/refman/5.1/en/drop-table.html
tôi cần phải thả tất cả các bảng, ngoại trừ một vài từ một bãi rác vô ý.
Một PHP chức năng để thả tất cả các bảng trừ một số (chuyển thể từ here), cho bất kỳ ai khác có thể cần:
<?php
$mysqli = new mysqli("localhost", "user", 'password', "database");
function drop_all_tables($exceptions_array, $conn) {
$exceptions_string="('" ;
foreach ($exceptions_array as $table) {
$exceptions_string .=$table . "','";
}
$exceptions_string=rtrim($exceptions_string, ",'");
$exceptions_string .="')" ;
$sql="SELECT CONCAT('DROP TABLE ', TABLE_NAME, '; ')
FROM information_schema.tables
WHERE table_schema = DATABASE() AND table_name NOT IN $exceptions_string";
$result=$ conn->query($sql);
while($row = $result->fetch_array(MYSQLI_NUM)) {
$conn->query($row[0]);
}
}
//drop_all_tables(array("table1","table2","table3","table4"), $mysqli);
?>
điều tốt đẹp tại foreign_key – IcanDivideBy0