Вставьте значения или проигнорируйте строку, если ограничение не выполнено
В SQL Server 2008 есть способ вставить строки, пропуская те строки, которые вызывают сбой ограничения внешнего ключа?
Например, у меня есть оператор вставки, похожий на этот:
insert into tblFoo(id, name, parent_id, desc) values
(1, 'a', 1, null),
(2, 'c', 3, 'blah'),
....;
parent_id - это fk для другой таблицы. Как я могу заставить сервер sql пропускать строки, в которых столбец fk недопустим?
Обновление Я хотел бы, чтобы это работало автоматически, без предварительной фильтрации тех строк, которые нарушают ограничение fk. Причина этого в том, что операторы вставки генерируются программой, поэтому заранее неизвестно, какие внешние ключи существуют в каждой таблице.
2 ответа
Это странная ситуация, в которой вы оказались, но вы можете вставить значения во временную таблицу, а затем выбрать только значения с допустимым FK.
что-то вроде:
declare @tempTable table (
id int,
name nvarchar(50) ,
parent_id int ,
[desc] nvarchar(50)
)
insert into @tempTable values
(1, 'a', 1, null),
(2, 'c', 3, 'blah')
insert into tblFoo(id, name, parent_id, [desc])
select tempTable.* from @tempTable as tempTable
inner join parent_id on parent_id.id = tempTable.parent_id
Одним из способов будет использование триггера вместо вместо на вставках и обновлениях. Затем вы можете оценить каждую строку, обновляемую до того, как произойдет фактическая запись в БД. Я вообще не большой поклонник триггеров, но у вас, кажется, здесь необычное требование.