Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.05.15;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.007 c
1-46772
aclon
2003-05-01 14:24
2003.05.15
запись числа десятичной дробью


1-46757
Xeon
2003-04-30 21:22
2003.05.15
Drag&Drop


6-46874
VanX
2003-03-19 10:50
2003.05.15
Срочно нужен компонент DialUp


14-46951
USB Flash Drive
2003-03-31 17:33
2003.05.15
При установке драйвера USB Flash исчезает CD-ROM ?


3-46627
N&N
2003-04-24 07:45
2003.05.15
Заполнение таблицы из справочника





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский