2014-03-24 5 views
0

나는 타임 스탬프 (SQL의 타임 스탬프가 아닌 PHP의 time()의 int)가있는 테이블에 항목이 삽입되는 데이터베이스가 있습니다. 가장 큰 타임 스탬프가 만료 시간보다 짧은 모든 테이블을 삭제하도록 쿼리를 만들고 싶습니다 (쿼리가 실행 된 시간으로부터 약간의 시간). 지금 당장 가지고 있어요테이블의 값을 기반으로 MySQL과 PHP DROP TABLE

$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

실제로이 질문을 게시 한 후 어제와 비슷한 것을 구현했습니다. 답변을 수락하지 못해 죄송합니다. 두 가지 대답이 옳았지만 그 당시 유일한 대답 이었기 때문에 첫 번째 답변을 수락했습니다. (이 모든 질문은 불필요합니다. DROP에 대한 MySQL 문서를 간단히 찾아 볼 수 있었기 때문에, 시간 낭비로 인해 유감스럽게 생각합니다.) – DankMemes

+0

lol @ accepting 이는 단지 하나이기 때문에 받아들입니다. – Alexander