Domanda

Sto lavorando in PHP.

Qual è il modo corretto di inserire nuovi record nel DB, che ha un campo univoco. Sto inserendo molti record in un batch e voglio solo inserire quelli nuovi e non voglio alcun errore per la voce duplicata.

C'è solo un modo per creare prima un SELECT e vedere se la voce è già lì prima di INSERT - e INSERT solo quando SELECT non restituisce alcun record? Spero di no.

Vorrei in qualche modo dire a MySQL di ignorare questi inserti senza errori.

Grazie

È stato utile?

Soluzione

Puoi utilizzare la sintassi INSERT ... IGNORE se non devi intraprendere alcuna azione in caso di record duplicati.

Puoi usare la sintassi SOSTITUISCI se vuoi sovrascrivi un vecchio record con uno nuovo con la stessa chiave.

In alternativa, puoi utilizzare INSERT ... ON DUPLICATE KEY UPDATE sintassi se si desidera eseguire un aggiornamento del record invece quando si incontra un duplicato.

Modifica: ho pensato di aggiungere alcuni esempi.

Esempi

Supponi di avere una tabella denominata tbl con due colonne, id e value . C'è una voce, id = 1 e valore = 1. Se esegui le seguenti dichiarazioni:

REPLACE INTO tbl VALUES(1,50);

Hai ancora un record, con id = 1 valore = 50. Si noti che l'intero record è stato prima ELIMINATO prima e quindi reinserito. Poi:

INSERT IGNORE INTO tbl VALUES (1,10);

L'operazione viene eseguita correttamente, ma non viene inserito nulla. Hai ancora id = 1 e valore = 50. Infine:

INSERT INTO tbl VALUES (1,200) ON DUPLICATE KEY UPDATE value=200;

Ora hai un singolo record con id = 1 e valore = 200.

Altri suggerimenti

Puoi utilizzare trigger .

Controlla anche questa guida introduttiva ai trigger .

Che aspetto ha lo schema del database?

Potresti aggiungere una colonna ID che auto incremento per ogni inserto, per garantire righe univoche.

Domanda: sto configurando un database con i client. So che utilizzi " inserisci " dichiarazione per inserire informazioni nel database, ma come posso assicurarmi di non inserire nuovamente le stesse informazioni client?

Risposta: puoi assicurarti di non inserire informazioni duplicate utilizzando la condizione EXISTS.

Ad esempio, se si disponesse di una tabella denominata client con una chiave primaria di client_id, è possibile utilizzare la seguente istruzione:

INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);

Questa istruzione inserisce più record con una sottoselezione.

Se si desidera inserire un singolo record, è possibile utilizzare la seguente istruzione:

INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);

L'uso della doppia tabella ti consente di inserire i tuoi valori in un'istruzione select, anche se i valori non sono attualmente memorizzati in una tabella.

da http://www.techonthenet.com/sql/insert.php

Prova a creare una tabella duplicata, preferibilmente una tabella temporanea, senza il vincolo univoco e fai il tuo caricamento di massa in quella tabella. Quindi seleziona solo gli elementi univoci (DISTINCT) dalla tabella temporanea e inseriscili nella tabella di destinazione.

$duplicate_query=mysql_query("SELECT * FROM student") or die(mysql_error());
$duplicate=mysql_num_rows($duplicate_query);
if($duplicate==0)
{
    while($value=mysql_fetch_array($duplicate_query)
    {
        if(($value['name']==$name)&& ($value['email']==$email)&& ($value['mobile']==$mobile)&& ($value['resume']==$resume))
        {
            echo $query="INSERT INTO student(name,email,mobile,resume)VALUES('$name','$email','$mobile','$resume')";
            $res=mysql_query($query);
            if($query)
            {
                echo "Success";
            }
            else
            {
                echo "Error";
            }
            else
            {
                echo "Duplicate Entry";
            }
        }
    }
}
else
{
    echo "Records Already Exixts";
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top