Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.15;
Скачать: CL | DM;

Вниз

INTERBASE & Autoincrement поля >>>   Найти похожие ветки 

 
msoftware ©   (2003-04-25 08:59) [0]

Господа программисты, кто знаком с InterBase и SQL, помогите разобраться с автоприращаемыми полями.
Например создадим генератор:
{Где STUDENT таблица, PERSONID - поле типа INTEGER}

CREATE GENERATOR PERSONID_GEN


Затем ТРИГГЕР:

SET TERM !!;
CREATE TRIGGER PERSONID_GEN FOR STUDENT
BEFORE INSERT AS
BEGIN
NEW.PERSONID=GEN_ID(PERSONID_GEN,1);
END !!
SET TERM; !!

Это позволяет автоприращать поле PERSONID. Но если в таблице например имеется 3 записи, и если удалить например 2 запись, то поле PERSONID будет как 1 | 3
Как исправить сложившуюся ситуацию???


 
Наталия ©   (2003-04-25 09:05) [1]

А зачем её исправлять? Пусть так и остаётся. Это нормально. ВЕРЬ мне. :))


 
Anatoly Podgorestky   (2003-04-25 09:10) [2]

Не надо исправить, что бы потом путаница была :-)


 
ЮЮ ©   (2003-04-25 09:28) [3]

Описанная случай называется уже AutoDecrement-ное поле, которое не реализовано ни на одном сервере БД, как этого ни хотят некоторые "программисты" :-)


 
msoftware ©   (2003-04-25 09:32) [4]

Все ясно, просто если сравнивать с PARADOX, то там у них все "по полочкам" ;)


 
Anatoly Podgorestky   (2003-04-25 09:36) [5]

ЮЮ © (25.04.03 09:28)
AutoIncDec Hole Free Field


 
Anatoly Podgorestky   (2003-04-25 09:37) [6]

По каким полочкам, там честное автоинкриментное поле, без заваротов мозга.


 
stone ©   (2003-04-25 09:38) [7]

msoftware © (25.04.03 09:32)

Если уж ты хочешь заполнять "дырки", то нужно немного исправить триггер
CREATE TRIGGER PERSONID_GEN FOR STUDENT
BEFORE INSERT AS
BEGIN
IF NEW.PERSONID IS NULL
NEW.PERSONID=GEN_ID(PERSONID_GEN,1);
END

Правда в этом случае (PERSONID должен быть PRIMARY KEY, иначе пострадает ссылочная целостность)


 
ЮЮ ©   (2003-04-25 09:40) [8]

В Парадоксе тоже никто не уменьшает автоинкрементное полею


 
Johnmen ©   (2003-04-25 09:45) [9]

>stone © (25.04.03 09:38)
>Если уж ты хочешь заполнять "дырки", то нужно немного исправить триггер

Не понял, как это поможет...:)


 
stone ©   (2003-04-25 09:53) [10]


> Johnmen © (25.04.03 09:45)
> >stone © (25.04.03 09:38)
> >Если уж ты хочешь заполнять "дырки", то нужно немного исправить
> триггер
>
> Не понял, как это поможет...:)

При инсерте с явным значением PERSONID (т.е. NEW.PERSONID IS NOT NULL) генератор не сработает, т.е. PERSONID примет указанное тобой значение. Вариант, конечно, не идеальный. К примеру, если добавить значение выше значения генератора, то в последствии (когда генератор дойдет до этого значения) возникнет ошибка. Так что при использовании "нестандартных" методов, следует быть поосторожнее.



 
Sergey13 ©   (2003-04-25 09:55) [11]

2stone © (25.04.03 09:38)
>Если уж ты хочешь заполнять "дырки", то нужно немного исправить риггер
Интересно, а как твой исправленный тригер будет дырки заполнять? Хотя с твоими дополнениями я полностью согласен.

2msoftware © (25.04.03 08:59)
Раздели в своей голове (и в БД соответственно) два понятия.
1 Ключевое поле таблицы
2 Табельный номер (или что ты там подразумеваешь под PERSONID).

Для 1 пропуски по барабану, т.к. это поле нигде и никогда не должно показываться никому (кроме тебя 8-). Оно должно быть неизменно всегда.
Для 2 важна просто уникальность, и оно может даже меняться со временем, и формироваться оно может как угодно - хоть на клиенте хоть на сервере.


 
Соловьев ©   (2003-04-25 09:56) [12]


> stone © (25.04.03 09:38)

это не заполнит, заполнит просто если ты не передаш сам значение поля...


 
stone ©   (2003-04-25 09:59) [13]

2 Соловьев © (25.04.03 09:56)
А я и не говорил, что заполнит. Я имелл в виду, что это даст возможность заполнять.


 
MsGuns ©   (2003-04-25 11:26) [14]

Вся прелесть парадоксовских автоэкскриментов проявляется, когда надо сделать, к примеру, перезаливку данных (т.е. сначала дать таблице Empty, а потом добавить в нее все записи, извлеченные предварительньно из нее же и сохраненные во временной таблице. Всем значениям полей, определенным как AutoInc, будут автоматически присвоены НОВЫЕ значения и, след-но полетит к чертям собачим вся ссылочность. Поэтому нужен гемор с пересозданием таблицы БЕЗ ключей, затем заливка, а потом индексирование и назначение "экскримента".
Кроме этого, при одновременной вставке в одну и ту же таблу нет никакой гарантии в том, что значение Вашего ключа будет РЕАЛЬНО уникально.

Генератор куда тоньше. См. stone © (25.04.03 09:38) + литература по КССУБД


 
Anatoly Podgorestky   (2003-04-25 11:33) [15]

ЮЮ © (25.04.03 09:40)
Не в Парадоксе, а в любой базе, которая поддерживает автинкриментные поля, поскольку они инкриментные
Только не ссылаться на Интребейс, там нет автинкриментных полей, их можно жмулировать с помощью генераторов и триггеров.

А если руками то это не авто


 
sunrider   (2003-04-25 12:05) [16]

Мой 6 летний опыт работы Interbase показал - если не хочешь
иметь гембель, генераторы не используй , а используй триггеры,
в коих можно в запросе точно определить максимальное значение по тому полю, которое нужно. Может и дольше, чем генератор - зато
никаких проблем вообще. Особенно если иметь дело с primary key


 
Johnmen ©   (2003-04-25 12:35) [17]

>sunrider (25.04.03 12:05)

Круто... Насчет 6-летнего опыта явно загнул...:)


 
MsGuns ©   (2003-04-25 12:43) [18]

>sunrider (25.04.03 12:05)

Сверхубежденность грозит мутировать в фанатизм.
У меня нет 6-летнего опыта ИБ, но есть 20-летний работы с РАЗНЫМИ БД. Проблема оптимального определения значения первичного ключа не решена в принципе. Механизм генераторов тоже ее не пытается решить, просто дает еще один способ - не нравится - не ешьте.
Только не надо говорить ВСЕМ, как это невкусно ;)))


 
Zacho ©   (2003-04-25 12:50) [19]


> sunrider (25.04.03 12:05)

Мой 5-ти летний опыт работы с IB показал, что использование SELECT MAX для генерации ПК (хоть в триггере, хоть где еще) - верный способ получения конфликтов при многопользовательской работе. И, еще, ну вставил ты ПК в триггере, а на клиента как его передашь ?



Страницы: 1 вся ветка

Текущий архив: 2003.05.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
14-46973
rain3092
2003-04-26 16:02
2003.05.15
Delphi 7


8-46859
dmibar
2003-01-30 00:33
2003.05.15
Господа,нужно набросать на панель мини картинки из как в ACDSee..


6-46885
asusfi
2003-03-19 18:22
2003.05.15
Чтение темы в TNMPOP3


6-46882
Dudao++
2003-03-14 09:47
2003.05.15
Линки в html доках


6-46886
ZEE
2003-03-17 16:28
2003.05.15
Как вызвать окошко