Таблица с большим количеством foreign key`s

Alexander
Дата: 08.02.2001 12:58:50
MSSQL 7.0
Проблема в следуещем:
Есть основная таблица CODE и много таблиц данных ссылающихся на CODE ( 1000-2000 шт. ),
соответственно каждая из которых имеет foreign key на CODE.
Мне нужно удалить строку из CODE (например, даже ни с кем не связанную ).

Я делаю следующие шаги:
1. alter table CODE nocheck constraint all - отключаю все foreign key для CODE
2. delete from CODE where cod_id=140931 - удаляю строку

Получаю:
Server: Msg 431, Level 16, State 1, Line 1
Could not bind foreign key constraint. Too many tables involved in the query.

Что неправильно?
P.S. Заранее спасибо.
SergSuper
Дата: 08.02.2001 13:16:16
Он пишет, что слишком много таблиц включено в запрос. Может попробовать писать не "constraint all", а каждую таблицу по отдельности.

А вообще мне трудно представить базу из 1000 таблиц, а тем более 1000 таблиц, привязанных к одной. Неужели это всё укладывается у Вас в голове? Может всё-таки можно структуру базы оптимизировать?
Если не секрет - для каких задач нужна такая база?

С приветом Сергей
Alexander
Дата: 08.02.2001 13:46:10
Если для каждой таблицы отключать, скрипт будет не маленький,
да и работать будет соответственно.
По поводу 1000-2000 таблиц: большинство из них в каком-то смысле однотипные -
поэтому держать в голове как раз эти таблицы не так трудно.
( прошу, если можно, воздержаться от естественных советов слить их в одну -
так задумано для решения определенного круга задач )
Назначение - как сказало начальство, секретно.
Но база эксплуатировалась успешно на InterBase, пока не подошла к 1 Gb.
1 таблицу приходится держать во внешнем файле, да и IB загибается(улся).
Перевожу под MSSQL 7.0 (проверенный), а у него куча ограничений.
Garya
Дата: 09.02.2001 20:49:13
А пробовал эти строчки разбить на отельные пакеты (поставить между ними GO)? При выполнении какой именно строки ругается?
Кирилл
Дата: 09.02.2001 20:57:40
У тебя слишком много вторичных ключей.
Разбей таблицу на несколько и сделай между ними отношение
ОДИН-К-ОДНОМУ
Alexander
Дата: 12.02.2001 13:13:40
Вообщем, foreign keys пришлось пока снять. Так работает,но что-то боязно.Что делать не знаю.
1.Ругается на команде delete.
2.Насчет разбить таблицу не понял. CODE одна из ключевых таблиц,
содержащая идентификационный код. А 2000 таблиц - это данные эксперементов. Как разбить-то?
3.Что значит "слишком много вторичных ключей"? В MS7.0 я такого ограничения не встречал.
А ошибка похоже стандартная.
Эх, может 2000 попробовать, там и поддержка триггеров удаления для вторичных ключей есть?
alexeyvg
Дата: 12.02.2001 18:55:23
Какая ещё "поддержка триггеров удаления для вторичных ключей"?
В 2000 есть каскадные foreign key`s. Сколько таблиц они поддерживают, к сожалению, не знаю.
А сделать RI (в т.ч. и каскадное удаление) на триггерах можно в 6.5, 7.0, 2000; разумеется, без всяких ограничений на количество таблиц.
Alexander
Дата: 13.02.2001 11:59:27
У меня нет в наличии информации по 2000 и я ориентируюсь на разные источники.
Не совсем понял как вторичные ключи могут быть каскадными.
Наверное, имеется ввиду, что в 2000 поддерживаются определенные объекты(типа триггер),
которые позволяют удалением из основной таблицы, также удалять каскадно
и из связанных по вторичным ключам.
Это я и имел ввиду,написав "поддержка триггеров удаления для вторичных ключей".
Кстати, в 7.0 и ранее это невозможно без отключения вторичных ключей, т.к. триггеры срабатывают уже после удаления. Но в моем примере на 2000 таблицах не сработала даже схема с отключением.
Если я ошибаюсь напишите.
А вообще насколько 2000 лучше 7.0 и стоит ли на них переходить?
alexeyvg
Дата: 13.02.2001 19:11:51
"Не совсем понял как вторичные ключи могут быть каскадными."
В 2000 ввели дополнительный тип FOREIGN KEY - каскадный.
CREATE TABLE order_part(order_nmbr int, part_nmbr int
FOREIGN KEY REFERENCES part_sample(part_nmbr) ON DELETE CASCADE)
При этом при удалении из основной таблицы сервер будет удалять каскадно и из связанных по вторичным ключам.

Триггеры - это другое.
Триггер - это хранимая процедура, которая вызывается автоматически после стейтмента.
Вы можете удалить все FOREIGN KEY и делать проверки ссылочной ц. и при необходимости другие действия в них. С любым к-вом таблиц это длжно работать. Ограничение - только размер текста триггера (по-моему, 256 Мб в 7.0 и 2000 и 64Кб в 6.5).
Это решение будет работать на любой версии.

2000 в принципе лучше 7.0, но лучьше не переходить, пока не выйдет первый СП - ошибок порядочно, а отдельные фиксы МС не высылает.