![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ограничение на поле
}|{yk © (2004-03-31 13:19:00)Как сделать ограничение на поле? Оно может принимать или значение из таблицы, или -1 (для дерева). В констрейнт не получается - нельзя подзапросы писать, с вьюхой связать тоже нельзя. А вообще как-то реализовывать можно? Можно конечно триггер написать, но это как-то неправильно...
Sergey13 (2004-04-01 08:21:00) [1]2}|{yk © (31.03.04 18:41) [40]
Как могут "деревянные" поля ссылаться на справочник?
roottim (2004-03-31 20:12:00) [2]2jonmen
хорошо переделаю exists - sql оператор а не ф-я
2жук
а что мешает сделать корень = null?
тогда в этом случае можно просто сделать констрейнт в виде вненего ключа самого на себя
ALTER TABLE MY_TABLE
ADD CONSTRAINT MY_TABLE_TREE FOREIGN KEY(PARENT_ID)
REFERENCES MY_TABLE(ID) ON DELETE CASCADE
Sergey13 (2004-03-31 18:46:00) [3]2}|{yk © (31.03.04 18:41) [40]
Опиши структуру таблиц и задачу, а то запутал ты всех, ИМХО.
Завтра продолжим, надеюсь.
Я домой.
}|{yk (2004-03-31 18:41:00) [4]просто я фиктивный элемент в справочник статей добавлять не могу
потому нужна проверка кроме того для дерева нужна проверка на циклы
Sergey13 (2004-03-31 18:35:00) [5]2}|{yk © (31.03.04 18:23) [38]
А по делу то, на чем остановился, на процедуре/тригере или на моем правильном предложении? 8-)
}|{yk (2004-03-31 18:23:00) [6]Оно конечно ErWin хорошо. Но я сейчас работаю не с уже работающей схемой, внедренной на предприятие, с которой к тому же работает много другий приложений, потому работать сейчас в ErWin никак не выйдет
Sergey13 (2004-03-31 17:58:00) [7]2Курдль © (31.03.04 17:52) [36]
Ну большому кораблю...
Мы уж лопатой да совком как нибудь, зато поближе к земле. 8-)
Курдль (2004-03-31 17:52:00) [8]
> >а уходят вглубь корнями аж до ER-модели
> Эк ты как глубоко копнул. Лопату не сломал? 8-)
8=()
Я уж давно меньше, чем экскаваторами не практикую.
Рисуешь неделю какую-то хреноплетень из прямоугольничков и стрелочек, а потом нажатием 2-х кнопок (создать физ.модель/ генерировать БД) получаешь ораклевую базу со всеми ее деревьями! :)
Sergey13 (2004-03-31 17:47:00) [9]2Курдль © (31.03.04 17:37) [34]
>а уходят вглубь корнями аж до ER-модели
Эк ты как глубоко копнул. Лопату не сломал? 8-)
>А такие приколы, как форинкей еще там отлавливаются! :)
Это проца по сравнению с форином прикол. 8-)
Курдль (2004-03-31 17:37:00) [10]
> Да и обычно так деревья в оракле растут.
В оракле деревья не так растут, а уходят вглубь корнями аж до ER-модели! А такие приколы, как форинкей еще там отлавливаются! :)
Sergey13 (2004-03-31 17:35:00) [11]2Курдль © (31.03.04 17:28) [32]
А с чего бы он всю бодягу поднял (это я как вышедший из отпуска телепат говорю?
Да и обычно так деревья в оракле растут.
8-)
Курдль (2004-03-31 17:28:00) [12]У "заявителя" не прописано, что это форинкей! (Тогда б и ежу было понятно, что оракл не даст напортачить и без всяких "-1").
Sergey13 (2004-03-31 17:25:00) [13]2Курдль © (31.03.04 17:15) [30]
>Это позволит лишь отказаться от проверки "на -1", но не от проверки "есть ли такое значение в таблице".
Почему это? Ставишь форинкей с ПарентИД на ИД и фсе.
Курдль (2004-03-31 17:15:00) [14]
> Вместо -1 NULL или в ту таблицу, на которую ссылается -1
> как служебную строку добавить? И включай простой констрейнт.
Это позволит лишь отказаться от проверки "на -1", но не от проверки " есть ли такое значение в таблице". А в последнем случае придется таки писать триггер.
Процедуры, подменяющие insert, update, delete - это опасная стратегия. Ведь некто может и не знать/забыть/не обратить внимания на то, что в таблицу разрешено вносить записи только через процедуру и долбануть insert. Зато триггер всегда начеку, как пограничная собака :)
Sergey13 (2004-03-31 17:09:00) [15]2roottim (31.03.04 17:02) [27]
Я понял. Мое "или в ту таблицу, на которую ссылается -1 как служебную строку добавить" следует читать как "или в таблицу -1 как служебную строку добавить". 8-)
А вот про проще/надежнее - почему это? Стандартный констр всяко надежнее и шустрее, ИМХО. К тому же иногда процедуры имеют свойство выключаться незаметно. 8-(
Чем меньше серверу мы пишем
Тем меньше сервер тормозит.
(с) Моя вольная трактовка классики 8-)
Johnmen (2004-03-31 17:08:00) [16]>2. exists это предикат sql а не функция и неотделим от него
Это в Оракле он так называется ?
roottim (2004-03-31 17:02:00) [17]2Sergey13 © (31.03.04 16:47) [26]
да речь здесь видимо не о внешнем констрейнте а о проверке дерево..
1. процедурой проще и надежней..
2. exists это предикат sql а не функция и неотделим от него
3. приведу пример , но проверять не буду для триггераперед_вставкой
begin
select id into :NEW.parent_id from my_table t where t.id = :NEW.parent_id;
-- если ид такого нет.. получите екскептион.. NO_DATA_FOUND
-- если есть то есть :)
end;
Sergey13 (2004-03-31 16:47:00) [18]2}|{yk © (31.03.04 13:19)
А если все по другому, попроще. 8-)
Вместо -1 NULL или в ту таблицу, на которую ссылается -1 как служебную строку добавить? И включай простой констрейнт.
Johnmen (2004-03-31 16:30:00) [19]>Курдль © (31.03.04 16:14) [22]
>Для установления истины не поленился ...
:)
Если еще не лень, то стоит сделать проверку корректно. Т.е. в запросе отвязаться от специфики/конкретики. Запрос д.б. прост.
Типа SELECT * FROM Table.
>}|{yk © (31.03.04 16:16) [23]
Странно... Но возможно...
Курдль (2004-03-31 16:29:00) [20]
> наверно в 9 можно exists использовать в pl/sql. А в 8 нельзя
Не-а! Когда я упростил до нельзя, - отругалося конкретно:
"функция или псевдо-столбец 'EXISTS' могут быть использованы только внутри оператора 'SELECT'!