2010-10-01 3 views
5
string sqlInsert = "Insert into account_details(
    account_number, 
    account_type, 
    transfer_access_code, 
    account_balance, 
    customer_id) 
SELECT 
    account_number, 
    account_type, 
    transfer_access_code, 
    account_balance, 
    customer_id 
from customer_details"; 

Cette requête prend juste des données de détails du client (table1) et l'insertion de dans d'autres table2 (account_details)contrainte de violation de clé primaire

lorsque cette requête est déclenché pour la première fois, il fonctionne très bien

mais lorsqu'il est déclenché une deuxième fois, il affiche l'erreur Violation de la contrainte PRIMARY KEY 'PK_account_details'. Impossible d'insérer une clé en double dans l'objet 'dbo.account_details'.

toute idée de sauter les données existantes dans (account_details) table1 et l'insertion de nouvelles données dans la ligne suivante

+1

ce qui est la clé primaire? –

+0

customer_id dans la table customer_details et le numéro de compte dans la table de détails du compte –

Répondre

5

L'utilisation d'un LEFT JOIN vous permet d'exclure toutes les lignes qui sont déjà présents dans le tableau account details. Une alternative à cela (et probablement même plus rapide) utilise un NOT EXISTS.

utilisant un LEFT JOIN

INSERT INTO account_details (
    account_number 
    , account_type 
    , transfer_access_code 
    , account_balance 
    , customer_id) 
SELECT account_number 
     , account_type 
     , transfer_access_code 
     , account_balance 
     , customer_id 
FROM customer_details cd 
     LEFT OUTER JOIN account_details ad ON ad.Account_number = cd.account_number 
WHERE ad.account_number IS NULL   

utilisant un NOT EXISTS

INSERT INTO account_details (
    account_number 
    , account_type 
    , transfer_access_code 
    , account_balance 
    , customer_id) 
SELECT account_number 
     , account_type 
     , transfer_access_code 
     , account_balance 
     , customer_id 
FROM customer_details cd 
WHERE NOT EXISTS (
      SELECT * 
      FROM  account_details 
      WHERE account_number = cd.account_number) 
+0

+1 pour la mention NOT EXISTS. Un exemple serait bon aussi. –

+0

Exemple EXISTS ajouté. –

4

en supposant Account_Number est la clé primaire, cela devrait fonctionner

string sqlInsert = "Insert into account_details(
    account_number, 
    account_type, 
    transfer_access_code, 
    account_balance, 
    customer_id) 
SELECT 
    cd.account_number, 
    cd.account_type, 
    cd.transfer_access_code, 
    cd.account_balance, 
    cd.customer_id 
from customer_details cd 
left outer join account_details ad 
    on cd.account_number = ad.account_number 
where ad.account_number is NULL"; 
+1

ahh, @Lieven, vous me battre de quelques secondes ... – Sage

+0

Je pensais déjà, * c'est effrayant *;) –

+2

+1 btw (7 ... non 2 ... non 556 caractères restants) –

0
INSERT INTO account_details (ad.account_number, ad.account_type, 
    ad.transfer_access_code, ad.account_balance, ad.customer_id) 
SELECT cd.account_number, cd.account_type, 
    cd.transfer_access_code, cd.account_balance, cd.customer_id 
FROM customer_details cd 
LEFT OUTER JOIN account_details ad 
    ON cd.account_number = ad.account_number 
WHERE ad.account_number is NULL 
Questions connexes