Справка по дублирующему ключу SQL - PullRequest
1 голос
/ 01 июня 2011

У меня есть утверждение, которое выглядит примерно так:

insert table_name(...)
select .... from ... join ... 

Как я могу использовать, где не существует или что-то в этом роде с этим оператором вставки и выбора, чтобы, если этот точный код был переопределен с теми же значениями, он не выдал ошибку. Я не хочу копировать и вставлять выборки / объединения в чеке, так как это довольно большой блок кода, поэтому есть ли способ сделать что-то вроде

if not exists (insert table_name(...)
              select ... from...join)

или это будет что-то вроде

insert table_name(...)
if not exists(select ... from ... join)

Ответы [ 4 ]

2 голосов
/ 01 июня 2011

Попробуйте использовать команду MERGE sql server.

http://technet.microsoft.com/en-us/library/bb510625.aspx

1 голос
/ 01 июня 2011

Попытка сделать это настолько общим, как вы, и при этом иметь смысл. Надеюсь, это понятно.

insert table_name(...)
select .... from ... join ... 
WHERE NOT EXISTS(SELECT NULL 
                     FROM table_name
                     WHERE PKColumn = YourOuterSelectTable.PKColumn)

Чтобы попытаться добавить немного мяса:

/* Assume Column1 is primary key */
INSERT INTO table_name
    (Column1, Column2)
    SELECT a.Column1, b.Column2
        FROM TableA a
            INNER JOIN TableB b
                ON a.Column1 = b.FKColumn1
        WHERE NOT EXISTS (SELECT NULL
                              FROM table_name
                              WHERE Column1 = a.Column1)
0 голосов
/ 01 июня 2011

В вашем выбрать .... из ... присоединиться ...

сделать левое соединение с таблицей, в которую вы вставляете, с новыми значениями, которые вы хотите вставить

если эти объединенные значения равны нулю, вы можете безопасно вставить их без ошибок.

0 голосов
/ 01 июня 2011

Вы можете просто поместить его в блок TRY CATCH, чтобы просто съесть исключение, если эта вставка не удалась.

http://geekswithblogs.net/ram/archive/2006/10/12/93829.aspx

В этой заметке я должен сказать, что этоПЛОХОЙ ПРАКТИКОЙ использовать исключения для управления логическим потоком.

Меня больше беспокоит то, почему такая ситуация существует, мне трудно думать о законной ситуации в ХОРОШЕМ ДИЗАЙНЕ, где эта проблема возникнет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...