Inserire o aggiornare tabella my sql controllando una coppia di valori

otto9due

Utente Attivo
22 Feb 2014
589
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.
 

otto9due

Utente Attivo
22 Feb 2014
589
25
28
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)
 

marino51

Utente Attivo
28 Feb 2013
3.202
207
63
Lombardia
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
 

otto9due

Utente Attivo
22 Feb 2014
589
25
28
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?
 

otto9due

Utente Attivo
22 Feb 2014
589
25
28
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)
 

otto9due

Utente Attivo
22 Feb 2014
589
25
28
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';
 

otto9due

Utente Attivo
22 Feb 2014
589
25
28
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
Autore Titolo Forum Risposte Data
Elisacau [Contact form 7] Inserire Numero auto incrementante WordPress 1
gara1 inserire immagine di sfondo in canvas Javascript 0
FDF182 Inserire pdf in db PHP 3
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
D Inserire link PHP 0
L PHPSpreadsheet inserire dati da file .xlsx/.xls su database PHP 2
P inserire due voci in un titolo post wp WordPress 1
R inserire video nel sito HTML e CSS 15
J Inserire blog wordpress in angular CMS (Content Management System) 0
A inserire variabile php colore in div html PHP 2
L inserire dati multi livello PHP 8
G Inserire una scritta Java 1
M Inserire variabile nella value di una hidden PHP 3
S Inserire foto in ogni cella di una tabella Javascript 0
G inserire dati automaticamente in mysql PHP 0
B Vorrei inserire una finestra con messaggio ad un history.back PHP 16
Shyson Inserire placeholder nel campo cerca PHP 5
M Lanciare alert se il codice fiscale è già presente nel db e lasciare la scelta di inserire all'utente PHP 42
atipika INSERIRE ICONE DOWNLOAD E STAMPA WORDPRESS WordPress 10
F Creare un set di date a seconda del frazionamento scelto da inserire in MySQL PHP 6
B inserire valori da una tabella a un altra mysql PHP 34
D [Javascript] inserire uno script in un file php Javascript 6
napuleone [HTML] type="file" inserire path di partenza HTML e CSS 4
Monital [Javascript] inserire dati estratti dal db in html fisso Javascript 1
R [WordPress] Inserire campi aggiuntivi ad un Submit Form già dato dal template (front-end) WordPress 0
M inserire i dati ottenuti da una jquery in una tabella già esistente jQuery 1
G Inserire "Leggi il resto dell'articolo" con link al post sul sito preso via RSS Email Marketing 0
M [PHP] Come inserire codice html in un ciclo while PHP 2
P [PHP] Inserire stringhe in input(text),memorizzarle e stamparle in file successivo PHP 0
J [Javascript] Inserire un caricamento con animazione prima dell'esecuzione di un'azione Javascript 1
Shyson [PHP] Inserire testo nel codice PHP 2
D Mailchimp - Possibile inserire doppia condizione per i triggers? Email Marketing 0
A [MS Access] Pulsante per inserire allegati in campo maschera MS Access 0
Shyson [HTML] Inserire nuovo font con @font-face HTML e CSS 5
Alex_70 Inserire photo in php PHP 0
D [Javascript] [HTML] Inserire slash dopo 3 numeri Javascript 5
F INSERIRE IN UN'UNICA CASELLA DI TESTO REPORT ACCESS I VALORI DELLA TABELLA DI UN'INTERA COLONNA MS Access 2
A [HTML] Come inserire google review stars nelle pagine del mio sito HTML e CSS 0
spider81man Connettersi ad un DB ed inserire dati con Javascript Javascript 3
spider81man [PHP] Inserire file .pdf in db PHP 6
P [WordPress] Inserire codice in pagina dinamica WordPress 0
A [PHP] Ciclare array multidimensionale e inserire valori in DB PHP 2
M [PHP] Inserire array nel db PHP 6
andreas88 [HTML] come inserire 3 riquadri in un unico rigo (vedere img allegata) HTML e CSS 11
G [PHP] inserire risultato di una query in una tabella PHP 3
P [Javascript] Inserire una nuova condizione in una funzione Javascript 3
G [Guida MyBB 1.8] Inserire icone accanto alle sezioni CMS (Content Management System) 0
M [wordpress-galleria immagini]Inserire classe php in html PHP 0
C Inserire dati tabella leggendo parte di altra tabella con php PHP 13
crealatualista [PHP] Inserire nomi nel database PHP 1

Discussioni simili