вставлять только уникальные значения - PullRequest
2 голосов
/ 29 апреля 2011

Мне нужно найти наиболее эффективный способ вставить значение в таблицу, но только если этого значения еще нет в таблице.

вот пример таблицы:

DECLARE @Table table (TheValue int primary key)

Примеры данных для вставки:

INSERT @Table SELECT 1 UNION SELECT 2 UNION SELECT 3 --existing data
DECLARE @x int;set @x=5                              --data to add

Вот все идеи, которые я могу придумать, чтобы сделать это.Какой из них лучше и / или есть лучший способ?Это пакетный процесс, поэтому нет риска, что другой процесс вставит данные, поэтому блокировка не требуется при попытке 1.

Попробуйте 1:

IF NOT EXISTS (SELECT 1 FROM @Table WHERE TheValue=@x)
BEGIN
    INSERT @Table VALUES (@x)
END

Попробуйте 2:

INSERT @Table SELECT @x EXCEPT SELECT TheValue FROM @Table

Попробуйте 3:

INSERT @Table SELECT @x WHERE @X NOT IN (SELECT TheValue FROM @Table)

Попробуйте 4:

BEGIN TRY
    INSERT @Table VALUES (@x)
END TRY
BEGIN CATCH END CATCH

Ответы [ 2 ]

2 голосов
/ 29 апреля 2011

почему бы не установить уникальное ограничение для этого столбца

1 голос
/ 29 апреля 2011

Вот еще один способ - самостоятельно присоединиться к таблице, в которую вы вставляете, и вставлять записи только там, где ее еще нет.

Во-первых, это таблица, в которую вы вставляете пакет, куда вы хотите вести уникальные записи. Имейте в виду, что у вас должно быть уникальное ограничение здесь. Вы хотите использовать только одну из этих уникальных вставок, чтобы никогда не сталкиваться с ограничением:

DECLARE @Table table (TheValue int primary key) 

Одна из таблиц, из которых вы получаете данные, которые вы хотите вставить в основную таблицу пакетов:

DECLARE @TableSelectingFrom table (TheValue int primary key) 

Например, просто заполнив это записью:

insert @TableSelectingFrom select 1

Существует левое внешнее соединение, поэтому мы извлекаем только уникальные записи из @TableSelectingFrom:

INSERT into @Table 
SELECT a.TheValue
from @TableSelectingFrom a
left join @Table b on a.TheValue = b.TheValue
where b.TheValue is null

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