MySQL LIMIT pe declarația DELETE (Programare, Mysql, Limita, Sql Delete)

Andre a intrebat.

Am alcătuit un tabel de test pentru o eroare pe care am întâlnit-o recent. Aceasta implică utilizarea LIMIT atunci când se încearcă ștergerea unei singure înregistrări dintr-un tabel MySQL.

Eroarea despre care vorbesc este „Aveți o eroare în sintaxa SQL; verificați manualul care corespunde versiunii serverului dvs. MySQL pentru a afla sintaxa corectă de utilizat lângă ‘LIMIT 1’ la linia 1

Tabelul pe care l-am creat se numește test; are 3 coloane, id, nume și creat. Am populat tabelul cu mai multe înregistrări și apoi am încercat să șterg una. Mai jos este declarația pe care am folosit-o pentru a încerca să realizez acest lucru.

DELETE t FROM test t WHERE t.name = 'foo' LIMIT 1

Fără utilizarea LIMIT 1, instrucțiunea se execută foarte bine, dar, desigur, nu aș fi folosit LIMIT dacă nu ar fi fost nevoie de ea.

Sunt pe deplin conștient de faptul că pot folosi o altă instrucțiune pentru a realiza cu succes acest DELETE. A se vedea mai jos:DELETE FROM test WHERE name = 'foo' LIMIT 1

Totuși, întrebarea mea este centrată pe motivul pentru care prima instrucțiune nu funcționează cu LIMIT.

Așadar, întrebarea mea este: ce am făcut incorect în ceea ce privește prima declarație pentru a genera această eroare?

7 răspunsuri
Ian Wood

interogarea de ștergere permite doar modificatori după „comanda” DELETE pentru a spune bazei de date ce/cum să trateze lucrurile.

consultați această pagină

Comentarii

    30

  • „Cu toate acestea, nu puteți utiliza ORDER BY sau LIMIT într-o operațiune DELETE cu mai multe tabele”. Acest lucru pare să răspundă la întrebarea mea. –  > Por Andre.
  • da – îmi pare rău că nu am citit asta din OP, dar ceea ce spuneți despre ștergerea dintr-o asociere este corect –  > Por Ian Wood.
Manoj Gupta

utilizați pur și simplu

DELETE FROM test WHERE 1= 1 LIMIT 10 

Comentarii

  • OP a declarat în mod clar că știe că acest lucru funcționează… „Sunt pe deplin conștient că pot folosi o altă declarație pentru a realiza cu succes acest DELETE.[…] DELETE FROM test WHERE name = 'foo' LIMIT 1” –  > Por Fabien TheSolution.
  • Nu pot folosi delete from pentru că trebuie să alătur date –  > Por Nicolas Thery.
  • de ce folosiți where 1 = 1 ? – –  > Por Reign.85.
ThelmaJay
DELETE t.* FROM test t WHERE t.name = 'foo' LIMIT 1

@Andre Dacă am înțeles ce mă întrebi, cred că singurul lucru care lipsește este t.* înainte de FROM.

Michel de Ruiter

De la documentația:

You cannot use ORDER BY or LIMIT in a multiple-table DELETE.

Joshua joseph bissot

Utilizați row_count - your_desired_offset

Deci, dacă avem 10 rânduri și dorim să decalăm 3

 10 - 3 = 7

Acum interogarea delete from table where this = that order asc limit 7 păstrează ultimele 3, iar order desc pentru a păstra primele 3:

$row_count - $offset = $limit

Delete from table where entry = criteria order by ts asc limit $limit

Shaolin

Există o soluție pentru a rezolva această problemă prin utilizarea unui tabel derivat.

DELETE t1 FROM test t1 JOIN (SELECT t.id FROM test LIMIT 1) t2 ON t1.id = t2.id

Deoarece LIMIT se află în interiorul tabelului derivat, join-ul se va potrivi doar cu un singur rând și, prin urmare, interogarea va șterge doar acest rând.

davidman77

Mai întâi m-am luptat puțin cu un DELETE FROM … USING … WHERE interogare,… Deoarece am vrut să testez mai întâi, am încercat cu SELECT FROM … USING … USING… WHERE … și acest lucru a provocat o eroare , … Apoi am vrut să reduc numărul de ștergeri adăugând
LIMIT 10, ceea ce a produs, de asemenea, o eroareApoi am eliminat „LIMIT” și – ura – a funcționat: „1867 rânduri șterse. (Interogarea a durat 1,3025 secunde.)”

Interogarea a fost:

DELETE FROM tableX 
USING tableX , tableX as Dup 
WHERE NOT tableX .id = Dup.id 
 AND tableX .id > Dup.id 
 AND tableX .email= Dup.email 
 AND tableX .mobil = Dup.mobil

Aceasta a funcționat.

Comentarii

  • Ți-am dat downvoted la răspunsul tău, pentru că nu este un răspuns la subiectul actual. Vă rugăm să consultați întrebarea de mai sus. –  > Por Peter.