Как удалить строки в связанных таблицах SQL?

Я хочу удалить строки в таблице GlassesColor, связанные с GlassesID в таблице Glasses. Я хочу реализовать это в хранимой процедуре. Хранимая процедура получает только один параметр со стороны клиента, CollectionID.

Вот следующие таблицы:

введите здесь описание изображения

Вот пример содержимого таблиц:

введите здесь описание изображения

Любая идея, как я могу реализовать это? Заранее спасибо!


person Michael    schedule 13.02.2012    source источник
comment
+1 всем!!! Мы все согласны с тем, что это должно быть ON DELETE CASCADE для ограничения внешнего ключа! :-) :-) :-)   -  person Julius Musseau    schedule 14.02.2012


Ответы (6)


Удаление вручную будет примерно таким:

delete 
from GlassesColor 
where GlassesID in (select GlassesID from Glasses where CollectionID = 3)

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

person Adriano Carneiro    schedule 13.02.2012

Самый простой способ — определить FOREIGN KEYS с параметрами CASCADE для DELETE.

http://msdn.microsoft.com/en-us/library/aa933119%28v=sql.80%29.aspx

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

person Stelian Matei    schedule 13.02.2012

Без хранимой процедуры используйте Constrains -> http://www.mssqlcity.com/Articles/General/using_constraints.htm OnDelete Cascade, поэтому, когда вы удаляете строку в очках, она также удаляется в цвете очков.

person Frano Hartman    schedule 13.02.2012

В вашем ограничении внешнего ключа для таблицы соединения GlassesColor укажите on delete cascade. Это означает, что при удалении записи, на которую ссылается первичный ключ, соответствующая строка ссылки внешнего ключа также будет удалена.

Таким образом, ваше определение таблицы GlassesColor будет выглядеть так:

create table GlassesColor
(
    GlassesId int foreign key references Glasses(GlassesID) on delete cascade,
    .....
)
go
person Community    schedule 13.02.2012

Я ответил что-то подобное для использования INFORMATION_SCHEMA в MSSQL

SQL Server: эквивалент каскадного удаления таблицы?

person Vinnie    schedule 13.02.2012

Вот самый простой способ сделать это в Microsoft SQL Server: когда вы создаете ограничение внешнего ключа, добавьте ON UPDATE CASCADE ON DELETE CASCADE к его определению. Я предполагаю, что вы хотите, чтобы изменения в GlassesID также распространялись. ;-) Если нет, то "КАСКАД НА ОБНОВЛЕНИЕ" не нужен.

Пример:

ALTER TABLE
  [GlassesColor]
WITH CHECK ADD CONSTRAINT
  [FK_GlassesColor_GlassesID]
FOREIGN KEY
  ([glassesID]) REFERENCES [Glasses] ([glassesID])
ON UPDATE CASCADE ON DELETE CASCADE
person Julius Musseau    schedule 13.02.2012