Inserire o aggiornare tabella my sql controllando una coppia di valori

otto9due

Utente Attivo
22 Feb 2014
591
25
28
Buonasera e Buon Natale trascorso.
Ho creato una tabella con i dati di alcuni prodotti, faccio l'upload di un file csv che viene processato e carico i dati nel db.
Ora vorrei che ansichè caricarli sempre, verifichi che non vi siano altri prodotti che hanno stesso sku e stesso fornitore.
Il problema è che nessuno di questi dati è una chiave primaria ne unica, poichè lo stesso prodotto può essere venduto da più venditori, e l'id (unica chiave primaria) viene assegnata dal db in maniera crescente.
In pratica, per semplificare vorrei inserire il recosrd se sku e id fornitore non esistono, altrimenti aggiornarlo.
Qualcuno ha qualche idea? Grazie in anticipo.
 
Sto seguendo questo esempio..
SQL:
IF EXISTS (SELECT * FROM Table1 WHERE Column1='SomeValue')
    UPDATE Table1 SET (...) WHERE Column1='SomeValue'
ELSE
    INSERT INTO Table1 VALUES (...)

Ma mi dice che c'è un'errore di sintassi sql. Ecco la mia verisone:
SQL:
IF EXISTS (SELECT * FROM prodotti WHERE sku = :sku AND fornitori_id = :fornitori_id)
                         UPDATE prodotti SET (nome=:nome, prezzo=:prezzo, produttore=:produttore, data_inserimento=:data_inserimento, data_aggiornamento=:data_aggiornamento, misura=:misura, misura_quant=:misura_quant, quant=:quant, categoria_id=:categoria_id ) WHERE sku=:sku AND fornitori_id=:fornitori_id
                    ELSE                   
                         INSERT INTO prodotti (nome, prezzo, sku, produttore, data_inserimento, data_aggiornamento, misura, misura_quant, quant, categoria_id, fornitori_id )
                                VALUES(:nome, :prezzo, :sku, :produttore, :data_inserimento, :data_aggiornamento, :misura, :misura_quant, :quant, :categoria_id, :fornitori_id)
 
non ho grandi conoscenze di mySQL,
ma credo che IF come lo stai usando tu sia accettato solo in "stored programs"
proverei a riscriverla con "CASE"
SQL:
SELECT CASE (SELECT 1 FROM prodotti WHERE sku = :sku AND fornitori_id = :fornitori_id)
WHEN 1 THEN
    UPDATE prodotti SET (nome=:nome, prezzo=:prezzo, ......
ELSE
    INSERT INTO prodotti (nome, prezzo, sku, produttore, ......
                  VALUES (:nome, :prezzo, :sku, :produttore, ......
END;

considera che, non avendo la chiave composta "sku, fornitori_id", ad ogni esecuzione, viene letta sequenzialmente tutta la tabella
 
non ho grandi conoscenze di mySQL,
ma credo che IF come lo stai usando tu sia accettato solo in "stored programs"
proverei a riscriverla con "CASE"
SQL:
SELECT CASE (SELECT 1 FROM prodotti WHERE sku = :sku AND fornitori_id = :fornitori_id)
WHEN 1 THEN
    UPDATE prodotti SET (nome=:nome, prezzo=:prezzo, ......
ELSE
    INSERT INTO prodotti (nome, prezzo, sku, produttore, ......
                  VALUES (:nome, :prezzo, :sku, :produttore, ......
END;

considera che, non avendo la chiave composta "sku, fornitori_id", ad ogni esecuzione, viene letta sequenzialmente tutta la tabella
Grazie anzitutto per l risposta. Cosa intendi con SELECT 1 ? L'1 cosa rappresenta, con cosa lo devo sostituire?
 
Ho trovato anche questo snippet, che sembra velocizzi la cosa..
SQL:
UPDATE dbo.customer_comments
SET customer_comment= @comment + 'something here'
WHERE customer_id = @customerId
IF @@ROWCOUNT = 0
      INSERT INTO dbo.customer_comments (customer_id, customer_comment)
      VALUES (@customerId, @comment)
 
Alla fine ho creato un campo formato da sku+idfornitore come chiave primaria ed ho usato questa query trovata online e riadattata... Mi sembra bbastanza veloce e funzioana :)
SQL:
INSERT INTO gcd_data (gcd_id, post_title, post_content, post_date_gmt,
                      post_modified_gmt, post_url, post_type)
    VALUES (1024, 'Hello World', 'How Are You?', '', '', 'www.google.com', 'product')
    ON DUPLICATE KEY UPDATE
        post_title = 'Hello World',
        post_content = 'How Are You?',
        post_date_gmt = '',
        post_modified_gmt = '',
        post_url = 'www.google.com',
        post_type = 'product';
 
Grazie mille per la risposta, non conoscevo questo case, andró sicuramente ad approfondire, potrebbe sicuramente servire in altri contesti. Grazie ancora.


Inviato dal mio iPhone utilizzando Tapatalk
 

Discussioni simili