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.