Форум: "Базы";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
ВнизПломбы... Найти похожие ветки
← →
GanibalLector © (2004-07-08 22:26) [0]Имеется следующая структура :
-серия пломб; varchar(2)
-начальный номер; int
-конечный номер; int
Пример:
АА 000001 000250
АА 000251 003000
АБ 174000 192055
Так вот,необходимо что-бы пломбы не пересекались т.е. что-бы такого не было:
АА 000001 000009
АА 000002 000005 <- такие пломбы уже есть!!!
Вот думаю...как такое реализовать???Может изменить структуру таблицы???Что скажите
← →
jack128 © (2004-07-08 23:24) [1]на тригер повесить
if (exists(select 1 from Таблица where not (Конечный_номер_номер > new.Конечный_номер or Конечный_номер < new.Конечный_номер_номер)) then
exception EINVALID_PLOMDA
← →
GanibalLector © (2004-07-08 23:34) [2]>на тригер повесить
Как по мне,так проще в ХП запихнуть и там проверять.
И еще,а что значит 1. Ты вот пишешь : select 1
Никогда такого не видел.
З.Ы. Спасибо!!!
← →
GanibalLector © (2004-07-08 23:38) [3]2 jack128
И еще...там же замес с серией.Т.е. в твоей реализации такому не бывать:
АА 000001 000005
АБ 000001 000004
а реально,такое может случиться.
Ладно,ща и я мозг включу...может,что получится.
← →
jack128 © (2004-07-08 23:41) [4]а чего тут думать, добавить в условие new.Серия = Серия and
> if (exists(select 1 from Таблица where new.Серия = Серия and not (Конечный_номер_номер
> > new.Конечный_номер or Конечный_номер < new.Конечный_номер_номер))
> then
> exception EINVALID_PLOMDA
← →
jack128 © (2004-07-08 23:44) [5]
> И еще,а что значит 1. Ты вот пишешь : select 1
> Никогда такого не видел
нам же не важно какие данные вернет запрос - нам нужно только узнать есть ли такие записи или нет. если убрать условие exists и оставить только запрос select 1 from .. то он вернет столько единиц сколько записей удволитворяют условиям этого запроса..
> Как по мне,так проще в ХП запихнуть и там проверять
смотри сам - с твой колокольни виднее..
← →
3APA3A (2004-07-08 23:54) [6]Можешь, конечно, изменить структуру таблицы, но я думаю правильнее будет в триггере перед добавлением новой записи проверять это...
Примерно так
SET TERM!!;
CREATE TRIGGER BEF_INS FOR YOURTABLE
ACTIVE BEFORE INSERT
AS
DECLARE START_NUM INTEGER;
DECLARE END_NUM INTEGER;
BEGIN
FOR SELECT START_NUMBER, END_NUMBER FROM ASD ORDER BY START_NUMBER INTO :START_NUM, :END_NUM
DO
IF (
((NEW.START_NUMBER >= :START_NUM) AND (NEW.END_NUMBER <= :END_NUM))
OR
((NEW.START_NUMBER <= :START_NUM) AND (NEW.END_NUMBER >= :START_NUM))
OR
((NEW.START_NUMBER <= :END_NUM) AND (NEW.END_NUMBER >= :END_NUM))
) THEN EXCEPTION PIZDEC;
END!!
SET TERM;!!
← →
Johnmen © (2004-07-09 09:09) [7]>GanibalLector ©
Тебе конкретно что надо ?
Просто факт пересечения или вывод пересекающихся ?
← →
Соловьев © (2004-07-09 09:24) [8]
> Вот думаю...как такое реализовать???Может изменить структуру
> таблицы???Что скажите
Имхо, таблица из двух полей:
1-е - Серия
2-е - номер(ключевое)
← →
Соловьев © (2004-07-09 09:27) [9]
> 1-е - Серия
> 2-е - номер(ключевое)
хтя, конечно нужно 2 поля как коючевое использовать. Серии то разные бывают...
← →
GanibalLector © (2004-07-09 09:37) [10]2 Johnmen
Исключение пересечения пломб.Вроде бы в [0] все написано.
2 Соловьев
>Имхо, таблица из двух полей
Да я тоже думал о этом.Но,контора получает по 1000 пломб в два месяца.И вот представь себе...либо 1 запись либо 1000.
2 ALL
Всем спасибо.[1] и [6] устраивают целяком и полностью.
← →
Соловьев © (2004-07-09 09:40) [11]
> либо 1 запись либо 1000.
ну и что? это что много?
причем можно по каждой пломбе вести инфу, а что можно сделать с такой структорой что сейчас? токо траблы.
← →
Курдль © (2004-07-09 09:41) [12]
> jack128 © (08.07.04 23:24) [1]
> на тригер повесить
> GanibalLector © (08.07.04 23:34) [2]
> Как по мне,так проще в ХП запихнуть и там проверять.
А почему не оформить, как декларацию ООН???
Мне кажется, что уникального индекса будет вполне достаточно.
(ХП - самый наихудший из всех возможных вариантов, включая декларацию ООН!)
← →
Johnmen © (2004-07-09 09:45) [13]>GanibalLector © (09.07.04 09:37) [10]
>Вроде бы в [0] все написано.
>>>Так вот,необходимо что-бы пломбы не пересекались
Для этого достаточно их просто не вводить...:)
← →
GanibalLector © (2004-07-09 09:53) [14]2 Соловьев
>причем можно по каждой пломбе вести инфу, а что можно сделать с такой структорой что сейчас? токо траблы.
Да он и так ведется,но в других таблицах.А эта таблица только для проверок.Т.е. мне нельзя использовать пломбу если ее нет в пришедших и (все описаное выше) пересечение.
2 Курдль
Ок.
2 Johnmen
Ну вот...опять началось.
2 ALL
Да говорю-же вопрос СНЯТ.
← →
Johnmen © (2004-07-09 09:57) [15]http://ln.com.ua/~openxs/articles/smart-questions-ru.html
Без обид.
← →
jack128 © (2004-07-09 11:04) [16]
> Мне кажется, что уникального индекса будет вполне достаточно.
на что ты иникальный ключ вешать собираешься?
← →
Курдль © (2004-07-09 11:13) [17]
> jack128 © (09.07.04 11:04) [16]
> на что ты иникальный ключ вешать собираешься?
Сорри! Невнимательно прочитал невнятное условие автора.
Оказывается надо, чтобы интервалы номеров пломб не пересекались!
Тогда однозначно триггер!
← →
Соловьев © (2004-07-09 11:16) [18]
> .А эта таблица только для проверок.Т.е. мне нельзя использовать
> пломбу если ее нет в пришедших и (все описаное выше) пересечение.
Я так и не понял нафиг проверка? зачем еще одна сушность в бд? чтобы жизнь малиной не казалась? :)
← →
Соловьев © (2004-07-09 11:17) [19]
> Пример:
> АА 000001 000250
> АА 000251 003000
> АБ 174000 192055
можно с помощью ХП построить из табицы вида [8]
← →
Курдль © (2004-07-09 11:30) [20]
> Соловьев © (09.07.04 11:16) [18]
> Я так и не понял нафиг проверка? зачем еще одна сушность
> в бд? чтобы жизнь малиной не казалась? :)
Вот и я не понял... Если надо в любом случае регистрировать каждую пломбу, то [12]. Если только регистрировать серии пломб без детализации - [17].
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.037 c