|
Таблица с большим количеством foreign key`s
|
|||
---|---|---|---|
#18+
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. Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2001, 12:58 |
|
Таблица с большим количеством foreign key`s
|
|||
---|---|---|---|
#18+
Он пишет, что слишком много таблиц включено в запрос. Может попробовать писать не "constraint all", а каждую таблицу по отдельности. А вообще мне трудно представить базу из 1000 таблиц, а тем более 1000 таблиц, привязанных к одной. Неужели это всё укладывается у Вас в голове? Может всё-таки можно структуру базы оптимизировать? Если не секрет - для каких задач нужна такая база? С приветом Сергей ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2001, 13:16 |
|
Таблица с большим количеством foreign key`s
|
|||
---|---|---|---|
#18+
Если для каждой таблицы отключать, скрипт будет не маленький, да и работать будет соответственно. По поводу 1000-2000 таблиц: большинство из них в каком-то смысле однотипные - поэтому держать в голове как раз эти таблицы не так трудно. ( прошу, если можно, воздержаться от естественных советов слить их в одну - так задумано для решения определенного круга задач ) Назначение - как сказало начальство, секретно. Но база эксплуатировалась успешно на InterBase, пока не подошла к 1 Gb. 1 таблицу приходится держать во внешнем файле, да и IB загибается(улся). Перевожу под MSSQL 7.0 (проверенный), а у него куча ограничений. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2001, 13:46 |
|
Таблица с большим количеством foreign key`s
|
|||
---|---|---|---|
#18+
А пробовал эти строчки разбить на отельные пакеты (поставить между ними GO)? При выполнении какой именно строки ругается? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2001, 20:49 |
|
Таблица с большим количеством foreign key`s
|
|||
---|---|---|---|
#18+
У тебя слишком много вторичных ключей. Разбей таблицу на несколько и сделай между ними отношение ОДИН-К-ОДНОМУ ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2001, 20:57 |
|
Таблица с большим количеством foreign key`s
|
|||
---|---|---|---|
#18+
Вообщем, foreign keys пришлось пока снять. Так работает,но что-то боязно.Что делать не знаю. 1.Ругается на команде delete. 2.Насчет разбить таблицу не понял. CODE одна из ключевых таблиц, содержащая идентификационный код. А 2000 таблиц - это данные эксперементов. Как разбить-то? 3.Что значит "слишком много вторичных ключей"? В MS7.0 я такого ограничения не встречал. А ошибка похоже стандартная. Эх, может 2000 попробовать, там и поддержка триггеров удаления для вторичных ключей есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2001, 13:13 |
|
Таблица с большим количеством foreign key`s
|
|||
---|---|---|---|
#18+
Какая ещё "поддержка триггеров удаления для вторичных ключей"? В 2000 есть каскадные foreign key`s. Сколько таблиц они поддерживают, к сожалению, не знаю. А сделать RI (в т.ч. и каскадное удаление) на триггерах можно в 6.5, 7.0, 2000; разумеется, без всяких ограничений на количество таблиц. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2001, 18:55 |
|
Таблица с большим количеством foreign key`s
|
|||
---|---|---|---|
#18+
У меня нет в наличии информации по 2000 и я ориентируюсь на разные источники. Не совсем понял как вторичные ключи могут быть каскадными. Наверное, имеется ввиду, что в 2000 поддерживаются определенные объекты(типа триггер), которые позволяют удалением из основной таблицы, также удалять каскадно и из связанных по вторичным ключам. Это я и имел ввиду,написав "поддержка триггеров удаления для вторичных ключей". Кстати, в 7.0 и ранее это невозможно без отключения вторичных ключей, т.к. триггеры срабатывают уже после удаления. Но в моем примере на 2000 таблицах не сработала даже схема с отключением. Если я ошибаюсь напишите. А вообще насколько 2000 лучше 7.0 и стоит ли на них переходить? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2001, 11:59 |
|
Таблица с большим количеством foreign key`s
|
|||
---|---|---|---|
#18+
"Не совсем понял как вторичные ключи могут быть каскадными." В 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, но лучьше не переходить, пока не выйдет первый СП - ошибок порядочно, а отдельные фиксы МС не высылает. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2001, 19:11 |
|
|
start [/forum/topic.php?fid=46&msg=32002077&tid=1827349]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 10ms |
total: | 140ms |
0 / 0 |