Newsgroup: it.comp.lang.delphi
Titolo: query insert

Salve a tutti ho questo problema : con questa query devo inseride dei
dati provenienti da un'altro database firebird in un database mysql.
Va tutto bene solo che per questa tabella devo fare un controllo
perche' mi vengono i record duplicati.
Cioe' devo inserire le ditte in modo univoco, senza duplicarle . Ho
creato questo controllo per vedere se la ditta esiste, leggendo tutti
i record del database prima di fare l'inserimento, ma non funziona,
perche' trova il codice ditta duplicato. Potete suggerirmi un metodo
alternativo.
Io avevo pensato alla funzione ON DUPLICATE KEY UPDATE, ma il mio
codice ditta non e' la key primaria che e' invece e' id_ditta.
grazie a tutti
raffaele
     query_mysql1.Close;
                 query_mysql1.SQL.Text := 'select mf_codice from
jos_vm_manufacturer';
                 query_mysql1.Open;
             while not query_mysql1.eof do
             begin
                 cod_ditta_mysql := '';
                 cod_ditta_mysql :=
trim(query_mysql1.FieldByName('mf_codice').AsString);
                 if      cod_ditta_mysql = trim( cod_ditta) then
                 begin
                 Ditta_esiste := true;
                 end
                 else
                 begin
                 Ditta_esiste := false;
                 end;
              query_mysql1.Next;
                 query_mysql1.close;
              end;
                 ////////////////////////////////////////\par
                /// Scrivo il record ditte MySql //\par
                ////////////////////////////////////////\par
                  if ( Ditta_esiste=false) then
                   begin
                  Query_mysql2.Close;
                  Query_mysql2.SQL.Clear();
                  Query_mysql2.SQL.Text := 'insert  into
jos_vm_manufacturer(manufacturer_id,mf_name,mf_email,mf_url,mf_codice )'+
                                        'values
(:id_ditta,:des_ditta,:mail_ditta,:web_ditta,:cod_ditta)';
 
Query_mysql2.ParamByName('id_ditta').AsString:=id_ditte;
 
Query_mysql2.ParamByName('des_ditta').AsString:=des_ditta;
 
Query_mysql2.ParamByName('mail_ditta').AsString:=mail_ditta;
 
Query_mysql2.ParamByName('web_ditta').AsString:=web_ditta;
 
Query_mysql2.ParamByName('cod_ditta').AsString:=cod_ditta;
                  Query_mysql2.ExecSQL();
                  inc (id_ditta);
                   end
                   else
          begin
          end;

 codice ditta non e' la key primaria che e' invece e' id_ditta.
Forse non ho esattamente capito ci� che vuoi fare, o mi sfugge qualcosa, 
ma se in effetti vuoi solo semplicemente inserire dei record facendo 
attenzione a non duplicarli la cosa potrebbe essere pi� semplice:
1. Chiarisciti secondo quale insieme di colonne stai definendo i "record 
duplicati"
2. Metti un indice univoco su tale insieme di campi. A quanto mi sembra 
di capire si tratta di un CODICE.
3. A questo punto hai due strade, a seconda di ci� che vuoi poi fare:
A) Scartare eventuali duplicati
B) Trattare i duplicati come record in aggiornamento
Per la prima possibilit� puoi eseguire l'insert into tabella all'interno 
di un blocco try..except..end inmodo da scartare, ma loggare, i dati che 
non vanno. L'eccezione ti viene solitamentei inviata dal DB quando tenti 
di inserire una chiave duplicata
Per la seconda dovrai fare prima una "select campo from tabella where 
campo=<valore>" per vedere se il record con quel codice esiste o no; se 
esiste devi eseguire una qery di UPDATE, altrimenti va bene una INSERT.
Potrei aver detto vari tipi di baggianate in funzione della mancanza di 
informaizoni pi� specifiche, e in tal caso me ne scuso
-- 
byez
Piero


ho optato per la seconda soluzione
infatti ho inserito un cotrollo se esiste
eh ho fatto la scelta