А что если я хочу работать на разных базах данных и чтобы я мог добавлять записи, не вычисляя "какой следующий id я должен поставить" .
Меня интересует простой вариант, не надо никаких наворотов под конкретную базу данных.
По большому счету перед тем как вставить запись мне стоит всегда делать например
"SELECT MAX(id) FROM any_table".
Потом загнать этот id в переменную, прибавить +1.
И потом можно сделать
INSERT INTO any_table (id, text) VALUES ($max_id_plus_one, 'Any text');
Или есть какая-нибудь простая альтернатива для AUTOINCREMENT'а ?
Спустя 15 минут, 12 секунд (24.01.2009 - 17:28) twin написал(а):
Это не верное решение. Дело в том, что удалив последнюю строчку, Вы таким образом присвоете её номер следующей, что при AUTOINCREMENT недопустимо. Нужна еще одна таблица, в которую и нужно писать MAX(id)+1, и присваивать это значение свежей записи. А при удалении записей эту таблицу не трогать.
Спустя 26 минут, 37 секунд (24.01.2009 - 17:55) sergeiss написал(а):
На самом деле, это НЕ фишка MySQL. То же самое есть, например, и в PostgreSQL 
А дальше можешь делать так, как twin написал.
Насчет "наворотов". А что считать таковым?
То, что ты не знаешь как сделать или что-то другое?
Можно сделать более-менее просто всё. С использованием встроенной функции, в которой как раз и будет использоваться вспомогательная таблица. В которой хранится то самое значение, которое было максимальное. А вспомогательная функция берет это значение, увеличивает и возвращает.
По сути дела, это будет тот же самый автоинкремент, только сделанный принудительно.

А дальше можешь делать так, как twin написал.
Насчет "наворотов". А что считать таковым?

Можно сделать более-менее просто всё. С использованием встроенной функции, в которой как раз и будет использоваться вспомогательная таблица. В которой хранится то самое значение, которое было максимальное. А вспомогательная функция берет это значение, увеличивает и возвращает.
По сути дела, это будет тот же самый автоинкремент, только сделанный принудительно.
Спустя 8 часов, 36 минут, 58 секунд (25.01.2009 - 02:32) multio написал(а):
twin спасибо - твое предложение хорошее.
sergeiss - спасибо за внимание, с Postgre не работал потому не знал. но тем не менее AUTOINCREMENT не во всех базах данных есть и если переходить напрмер с MySQL на Oracle или еще куда-то могут появиться проблемы если все "завязано" на AUTOINCREMENT.
Навороты я имел ввиду например такое для Oracle:
>В Oracle я полный лох, поэтому помогите написать тригер для этого >AUTO_INCREMENT.
>CREATE OR REPLACE TRIGGER ti_customer_ss
> BEFORE INSERT ON customer
> FOR EACH ROW
>BEGIN
> IF :new.customer_id IS NULL THEN
> SELECT customer_id_sq.nextval INTO :new.customer_id FROM dual;
> END IF;
>END ti_customer_ss;
Нарвался сегодня утром когда искал по этой теме инфу (еще видел вариант с использованием sequence, но что-то сейчас тот линк не открывается где смотрел
)
Спасибо за внимание вариант от twin мне понравился,
просто и понятно.
sergeiss - спасибо за внимание, с Postgre не работал потому не знал. но тем не менее AUTOINCREMENT не во всех базах данных есть и если переходить напрмер с MySQL на Oracle или еще куда-то могут появиться проблемы если все "завязано" на AUTOINCREMENT.
Навороты я имел ввиду например такое для Oracle:
>В Oracle я полный лох, поэтому помогите написать тригер для этого >AUTO_INCREMENT.
>CREATE OR REPLACE TRIGGER ti_customer_ss
> BEFORE INSERT ON customer
> FOR EACH ROW
>BEGIN
> IF :new.customer_id IS NULL THEN
> SELECT customer_id_sq.nextval INTO :new.customer_id FROM dual;
> END IF;
>END ti_customer_ss;
Нарвался сегодня утром когда искал по этой теме инфу (еще видел вариант с использованием sequence, но что-то сейчас тот линк не открывается где смотрел

Спасибо за внимание вариант от twin мне понравился,
просто и понятно.

Спустя 1 день, 18 часов, 7 минут, 16 секунд (26.01.2009 - 20:39) Alchemist написал(а):
Варианта twin'a решает только часть проблем. И вообще, хоть сам и не работал с Oracl'ом, я очень сильно сомневаюсь, что в там нет AUTOINCREMENT.
ЗЫ: спросил сейчас у друга - он сказал что там это "конечо есть, ты что сдурел ?!" Только называется SEQUENCE.
ЗЫ: спросил сейчас у друга - он сказал что там это "конечо есть, ты что сдурел ?!" Только называется SEQUENCE.
Спустя 1 час, 34 минуты, 42 секунды (26.01.2009 - 22:14) twin написал(а):
Вообще то я давал совет не для Oracl'а, о нем речи тогда не было... А какие проблемы не решает отдельня таблица? Вроде как оно так и устроено. Другой вопрос - дальнейшая работа, допустим запрет на принудительный повтор, но это к формированию отношения не имеет.
_____________