2014-03-24 49 views
0

中的值的MySQL和PHP DROP TABLE我有一個數據庫,其中條目插入帶有時間戳(來自PHP的time()而不是SQL時間戳)的表中。我想進行查詢以刪除最大時間戳小於失效時間的所有表(從查詢執行時起的一段時間)。現在我有基於表

$q = mysqli_query(..., "SHOW TABLES LIKE 'prefix%'"); 
if($q===FALSE) die(mysqli_error(...)); 
for($row in mysqli_fetch_array($q)){ 
    $slice = array_slice($row, 0, 1); 
    $tbl = array_shift($slice); 
    mysqli_query(..., "DROP TABLE `$tbl` WHERE ((SELECT GREATEST (SELECT `time` FROM `$tbl`)) <= $expiry_time)"); 
} 

這給出了SQL語法錯誤。

什麼是實現這一目標的正確方法? 此外,是否有可能消除PHP邏輯,只是循環遍歷每個表,並在必要時刪除所有的SQL?

+0

DROP TABLE命令中沒有WHERE子句。您確定要刪除表格而不刪除行嗎? – AgRizzo

+0

我打賭這可以在循環中使用準備好的語句在存儲過程中完成。 http://dev.mysql.com/doc/refman/5.5/en/sql-syntax-prepared-statements.html – captainroxors

+0

我應該在發佈之前查找drop table的語法。我的錯。你是對的,它沒有where子句。那麼我想如何實現? – DankMemes

回答

1

您嘗試過的方法將而不是工作 - 您正在混合data definition statementsdata manipulation statements

你可以在MySQL的存儲過程中做到這一點,但我沒有嘗試過。

所以你面臨着一個選擇:在MySQL中通過存儲過程(在我看來,它隱藏了實現)或者在PHP中執行它(代碼可能更易於理解)。

請注意,無論是哪種情況,您可能都需要鎖定表以防止表在查詢時(查找時間戳值)和刪除時間之間消失。

+0

雖然第二個想法是,「DROP TABLE IF EXISTS ...」應該是可以的,因爲無論如何你都希望它被刪除。 – Kryten

0

我不認爲你接受的答案是正確的。 我在你的代碼中添加了一些邏輯,這會給你你想要的。

$q = mysqli_query(..., "SHOW TABLES LIKE 'prefix%'"); 
if($q===FALSE) die(mysqli_error(...)); 
for($row in mysqli_fetch_array($q)){ 
    $slice = array_slice($row, 0, 1); 
    $tbl = array_shift($slice); 
$r = mysqli_query(..., "SELECT MAX(`time`) FROM $tbl HAVING MAX(`time`) <= $expiry_time"); 
    if ($r) { 
    mysqli_query(..., "DROP TABLE $tbl"); 
    } 
} 
+0

在發佈這個問題後,我實際上實現了類似於此的東西。抱歉不接受你的回答;雖然兩個答案都是對的,但我接受了第一個答案,因爲那是當時唯一的答案。 (這整個問題是不必要的,因爲我可以簡單地查看MySQL文檔的DROP,所以我很抱歉浪費你的時間) – DankMemes

+0

lol @接受,因爲它只有一個 – Alexander