2010-12-03 3 views
5

테이블에서 첫 번째 행을 선택하고 time (오름차순)으로 정렬 한 다음 해당 행을 삭제하고 싶습니다. 다른 클라이언트가 삭제되기 전에 다른 클라이언트가 해당 행을 선택할 수있는 가능성이 있기 때문에 두 개의 쿼리를 사용하고 싶지 않습니다 (다른 네트워크에서 여러 컴퓨터가 동시에 연결될 것입니다).SELECT 및 DELETE

나는

SELECT * FROM `mytable` ORDER BY `time` LIMIT 1; 
    DELETE FROM `mytable` ORDER BY `time` LIMIT 1 

같은 것을 할 수있는 생각했다 ... 그러나 나는 오류가 있어요 :

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; DELETE * FROM pending ORDER BY time LIMIT 1' at line 1

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 감사. 귀하의 오류 메시지가 다시

insert tmpTable 
     (id) 
select id 
from YourTable yt 
order by time limit 1; 

delete 
from YourTable 
where ID in (select id from tmpTable); 

답변

4

(귀하의 질문에 다른) :

2

당신은 임시 테이블을 만들어야합니다, MySQL은,이 코드를 참조하면 사용하는 테이블에서 삭제하지 않습니다

DELETE * FROM pending ORDER BY time LIMIT 1 

구문에 오류가 있습니다. *을 제거해보세요. 즉,

DELETE FROM pending ORDER BY time LIMIT 1 

정상적으로 작동해야합니다.

+0

나중에 tmpTable을 삭제해야합니까? –

+1

예 (15 자) –

+0

임시 테이블을 명시 적으로 만들 필요가 없습니다. 당신은 파생 된 테이블'Delete from YourTable from ID = ((time from YourTable order에서 ID를 선택하십시오.) t);'를 사용할 수 있습니다. 그러나 Riedsio의 대답은 훨씬 나아 보인다. –

1

같은 하위 쿼리를 사용할 수 있습니다.

delete from table where id in (select id from table order by time limit 1); 

성능상의 확실하지 않은 점은이 솔루션이 얼마나 좋은지입니다. 분석을 수행하고 이것이 어떻게 작동하는지보아야 할 것입니다.

관련 문제