Ограничение нарушения первичного ключа

#asp.net #sql #sql-server #ado.net

#asp.net #sql #sql-сервер #ado.net

Вопрос:

 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";
  

Этот запрос просто берет данные из сведений о клиенте (table1) и вставляет их в другую table2 (account_details)

когда этот запрос запускается в первый раз, он работает нормально

но при повторном запуске отображается ошибка Нарушения ограничения первичного КЛЮЧА ‘PK_account_details’. Не удается вставить дубликат ключа в объект ‘dbo.account_details’.

есть идея пропустить существующие данные в таблице (account_details) table1 и вставить новые данные в следующую строку

Комментарии:

1. что такое первичный ключ?

2. customer_id в таблице customer_details и account_number в таблице сведений об учетной записи

Ответ №1:

Использование a LEFT JOIN позволяет исключить все строки, которые уже присутствуют в account details таблице. Альтернативой этому (и, вероятно, даже быстрее) является использование NOT EXISTS .

используя 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        
  

используя 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)
  

Ответ №2:

предполагая, что Account_Number является первичным ключом, это должно сработать

 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. 1, потому что я знаю, как это раздражает, когда тебя опережают на несколько секунд. (И это хороший ответ)

2. Спасибо всем за поддержку, ребята. Я ценю это

Ответ №3:

 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