#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