Come eliminare una determinata riga dalla tabella mysql con gli stessi valori di colonna?


153

Ho un problema con le mie domande in MySQL. La mia tabella ha 4 colonne e sembra qualcosa del genere:

id_users    id_product    quantity    date
 1              2              1       2013
 1              2              1       2013
 2              2              1       2013
 1              3              1       2013

id_userse id_productsono chiavi esterne da tabelle diverse.

Quello che voglio è eliminare solo una riga:

1     2     1    2013

Che appare due volte, quindi voglio solo eliminarlo.

Ho provato questa domanda:

delete from orders where id_users = 1 and id_product = 2

Ma eliminerà entrambi (poiché sono duplicati). Qualche suggerimento su come risolvere questo problema?

Risposte:


208

Aggiungi limita alla query di eliminazione

delete from orders 
where id_users = 1 and id_product = 2
limit 1

3
Questo elimina solo una riga. Se ci fossero 3 con questo utente e ID prodotto, 2 rimarrebbero.
Rob,

10
Sì, OP dice che vuole eliminare 1 riga. Questo è ciò che fa la mia domanda.
juergen d

2
Sì, ma penso che questo non sia ciò che vuole.
Rob,

3
Grazie Juergen. Questo è tutto ciò di cui ho bisogno!
Dani

3
Ciò che l'OP deve veramente fare è controllare prima quali righe vengono duplicate, quindi eliminare i duplicati.
wbinky,

64

Tutte le tabelle dovrebbero avere una chiave primaria (costituita da una o più colonne), le righe duplicate non hanno senso in un database relazionale. Puoi limitare il numero di righe da eliminare usando LIMITperò:

DELETE FROM orders WHERE id_users = 1 AND id_product = 2 LIMIT 1

Ma questo risolve solo il tuo problema attuale, dovresti sicuramente lavorare sul problema più grande definendo le chiavi primarie.


1
È utile ricordare che la chiave primaria dovrebbe essere unica in un database relazionale.
Paul,

1
@Paul Questo è esattamente quello che sto per dire. Ma non dimenticare che una chiave univoca non significa necessariamente chiave primaria.
Ryan Fung,

20

È necessario specificare il numero di righe che devono essere eliminate. Nel tuo caso (e presumo che tu ne voglia mantenere solo uno) questo può essere fatto in questo modo:

DELETE FROM your_table WHERE id_users=1 AND id_product=2
LIMIT (SELECT COUNT(*)-1 FROM your_table WHERE id_users=1 AND id_product=2)

Grazie Rob, ma no ... Voglio solo cancellare una singola riga, non per conservarne solo una
Dani

Questo non funziona per me in 5.5.40, genera un errore di sintassi. Come menzionato qui: stackoverflow.com/a/578926/1076075 , sembra che non possiamo usare una subquery per specificare il valore di una clausola LIMIT. Per chi cerca di fare cose in questo modo, check this out: stackoverflow.com/q/578867/1076075
Bharadwaj Srigiriraju

8

Il modo migliore per progettare la tabella è aggiungere una riga temporanea come incremento automatico e conservare come chiave primaria. Quindi possiamo evitare tali problemi di cui sopra.


1
O una fila permanente. So che questa è una vecchia domanda, ma penso che dovrei dirlo. Gli ID sono usati per questo tipo di situazione. Se sei preoccupato per lo spazio: un BIGINT ha solo 8 byte!
Ismael Miguel,

5

Ci sono già risposte per Eliminazione riga da LIMIT. Idealmente dovresti avere la chiave primaria nella tua tabella. Ma se non c'è.

Darò altri modi:

  1. Creando indice univoco

Vedo che id_users e id_product dovrebbero essere unici nel tuo esempio.

ALTER IGNORE TABLE orders ADD UNIQUE INDEX unique_columns_index (id_users, id_product)

Questi elimineranno le righe duplicate con gli stessi dati.

Ma se ricevi ancora un errore, anche se usi la clausola IGNORE, prova questo:

ALTER TABLE orders ENGINE MyISAM;
ALTER IGNORE TABLE orders ADD UNIQUE INDEX unique_columns_index (id_users, id_product)
ALTER TABLE orders ENGINE InnoDB; 
  1. Creando nuovamente la tabella

Se ci sono più righe con valori duplicati, puoi anche ricreare la tabella

RENAME TABLE `orders` TO `orders2`;

CREATE TABLE `orders` 
SELECT * FROM `orders2` GROUP BY id_users, id_product;

1

Devi aggiungere un id che si auto-incrementa per ogni riga, dopodiché puoi eliminare la riga dal suo id. quindi la tua tabella avrà un ID univoco per ogni riga e l'id_user, id_product ecc ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.