2010-10-01 168 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"; 

这个查询只需要从客户的详细资料(表1),并插入的它在其他表2(account_details)数据主键冲突约束

当此查询时,会引发第一次工作正常

但当第二次触发时,显示错误 违反PRIMARY KEY约束'PK_account_details'。无法在对象'dbo.account_details'中插入重复键。

任何想法跳过(account_details)table1的现有数据和下一行

+1

什么是主键? – 2010-10-01 12:58:52

+0

customer_details表中的customer_id和帐户详细信息表中的account_number – 2010-10-01 12:59:43

回答

5

中插入新的数据使用LEFT JOIN让你排除所有已经存在于account details表中的行。此替代(甚至可能更快)是使用NOT EXISTS

使用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

用于提及NOT EXISTS的+1。一个例子也会很好。 – 2010-10-01 13:38:49

+0

不存在添加的示例。 – 2010-10-01 14:36:11

4

假设ACCOUNT_NUMBER是主键使用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   

,这应该工作

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

啊,@Lieven,你打我几秒... – Sage 2010-10-01 13:00:35

+0

我已经在想*这是令人毛骨悚然的*) – 2010-10-01 13:02:17

+2

+1顺便说一句(7 ...没有2 ...没有556个字符) – 2010-10-01 13:03:07

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