Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

INTERBASE & Autoincrement поля >>> [D6, IB6.x]


msoftware ©   (2003-04-25 08:59:00) 

Господа программисты, кто знаком с 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
Как исправить сложившуюся ситуацию???


Zacho   (2003-04-25 12:50:00) [1]


> sunrider (25.04.03 12:05)

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


MsGuns   (2003-04-25 12:43:00) [2]

>sunrider (25.04.03 12:05)

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


Johnmen   (2003-04-25 12:35:00) [3]

>sunrider (25.04.03 12:05)

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


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

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


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

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

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


MsGuns   (2003-04-25 11:26:00) [6]

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

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


stone   (2003-04-25 09:59:00) [7]

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


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


> stone © (25.04.03 09:38)

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


Sergey13   (2003-04-25 09:55:00) [9]

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

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

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


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


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

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


Johnmen   (2003-04-25 09:45:00) [11]

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

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


ЮЮ   (2003-04-25 09:40:00) [12]

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


stone   (2003-04-25 09:38:00) [13]

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, иначе пострадает ссылочная целостность)


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

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


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

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


msoftware   (2003-04-25 09:32:00) [16]

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


ЮЮ   (2003-04-25 09:28:00) [17]

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


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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо