Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Merge и FK  [new]
PaulWist
Member

Откуда:
Сообщений: 2267
Дано:

Табличка в которой реализована связь 1 - 1

create table t (id int primary key, parent_id int null  foreign key
references t ( id ), Name nvarchar(20) )


В табличке 3 записи, первые 2 две с id = 1,2 ссылаются друг на друга parent_id = 2,1.

Клиент вызвал на редактирование запись с id = 1, удалил её и создал запись с id = 4

Теперь при сохранении merge, FK естественно ругается на отсутствующую ссылку для записи с id = 2.

Собственно вопрос, как можно выйти из ситуации использую merge, если конечно такое возможно.

use tempdb

create table t (id int primary key, parent_id int null  foreign key
references t ( id ), Name nvarchar(20) )
go
-- Исходные данные
insert into t values(1, null, N'first')
insert into t values(2, null, N'second')
insert into t values(3, null, null)
go
-- первые две записи ссылаются сами на себя
update t set parent_id = 2 where id = 1
update t set parent_id = 1 where id = 2
go

select * from t
go
-- при редактировании записи с id = 1 эта запись была удалена
-- а вместо неё внесена запись с id = 4
;with cte as (select id, parent_id, name from t where id in (1)) 
merge cte as t using 
-- эта выборка аналог того, что пришло с клиента, после его редактирования
(select 4, null, 'first new') 
as s (id, parent_id, name)
	on t.id = s.id
when matched 
	then update
	set t.parent_id = s.parent_id, t.name = s.name
when not matched  
	then insert (id, parent_id, name) values (id, parent_id, name)
when not matched by source 
--!!!
-- вот тут валится ошибка, поскольку срабатывает FK для id = 2
-- поскольку у неё ссылка parent_id = 1 на удалённую запись
	then delete
;
go

select * from t
go

drop table t
go        
27 авг 13, 14:26    [14760691]     Ответить | Цитировать Сообщить модератору
 Re: Merge и FK  [new]
Glory
Member

Откуда:
Сообщений: 104751
PaulWist
Клиент вызвал на редактирование запись с id = 1, удалил её и создал запись с id = 4

Где "удалил" и "создал" то ? В гриде своего клиентского приложения ?
27 авг 13, 14:39    [14760742]     Ответить | Цитировать Сообщить модератору
 Re: Merge и FK  [new]
как то так
Guest
PaulWist,

;with cte as (
	select id, parent_id, name from t where id in (1, 2)
) 
merge cte as t using 
-- эта выборка аналог того, что пришло с клиента, после его редактирования
(	select 4, null, 'first new'
	union all
	select id, 4, name from t where id in (2)

) 
as s (id, parent_id, name)
	on t.id = s.id
when matched then 
	update set 
		t.parent_id = s.parent_id, t.name = s.name
when not matched then 
	insert (id, parent_id, name) values (id, parent_id, name)
when not matched by source 
--!!!
-- вот тут валится ошибка, поскольку срабатывает FK для id = 2
-- поскольку у неё ссылка parent_id = 1 на удалённую запись
	then delete
;
go
27 авг 13, 14:39    [14760747]     Ответить | Цитировать Сообщить модератору
 Re: Merge и FK  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
Merge не причем. У вас кольцевые ссылки, поэтому удалить запись не выйдет.
27 авг 13, 14:41    [14760755]     Ответить | Цитировать Сообщить модератору
 Re: Merge и FK  [new]
PaulWist
Member

Откуда:
Сообщений: 2267
Glory
PaulWist
Клиент вызвал на редактирование запись с id = 1, удалил её и создал запись с id = 4

Где "удалил" и "создал" то ? В гриде своего клиентского приложения ?


Например в гриде, ...

"Удалил" старую запись с id = 1 на клиенте, а вместо неё "создал" новую, ... те сначала с сервера была получена выборка

select * from t where id = 1


затем на сервер была отослана выборка

select 4, null, 'first new'


Вот эти новые данные теперь необходимо записать в таблицу.

Понятно, что надо обNullить поле parent_id для записи с id = 2, но вот возможно ли это как-то сделать в "основном" merge?
27 авг 13, 14:47    [14760788]     Ответить | Цитировать Сообщить модератору
 Re: Merge и FK  [new]
как то так
Guest
PaulWist
Понятно, что надо обNullить поле parent_id для записи с id = 2, но вот возможно ли это как-то сделать в "основном" merge?

а ответы вы не читаете?
27 авг 13, 15:11    [14760911]     Ответить | Цитировать Сообщить модератору
 Re: Merge и FK  [new]
PaulWist
Member

Откуда:
Сообщений: 2267
как то так
PaulWist
Понятно, что надо обNullить поле parent_id для записи с id = 2, но вот возможно ли это как-то сделать в "основном" merge?

а ответы вы не читаете?


Конечно читаю, спасибо, пока я отвечал Glory Вы дали свой ответ!
27 авг 13, 15:27    [14761048]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить