Текущий архив: 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.49 MB
Время: 0.011 c