[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Что использовать вместо AUTO INCREMENT не в MySQL
multio
Люди, я недавно узнал что AUTOINCREMENT - это "фишка" MySQL.

А что если я хочу работать на разных базах данных и чтобы я мог добавлять записи, не вычисляя "какой следующий 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 smile.gif
А дальше можешь делать так, как twin написал.
Насчет "наворотов". А что считать таковым? smile.gif То, что ты не знаешь как сделать или что-то другое?
Можно сделать более-менее просто всё. С использованием встроенной функции, в которой как раз и будет использоваться вспомогательная таблица. В которой хранится то самое значение, которое было максимальное. А вспомогательная функция берет это значение, увеличивает и возвращает.
По сути дела, это будет тот же самый автоинкремент, только сделанный принудительно.

Спустя 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, но что-то сейчас тот линк не открывается где смотрел smile.gif )


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

Спустя 1 день, 18 часов, 7 минут, 16 секунд (26.01.2009 - 20:39) Alchemist написал(а):
Варианта twin'a решает только часть проблем. И вообще, хоть сам и не работал с Oracl'ом, я очень сильно сомневаюсь, что в там нет AUTOINCREMENT.

ЗЫ: спросил сейчас у друга - он сказал что там это "конечо есть, ты что сдурел ?!" Только называется SEQUENCE.

Спустя 1 час, 34 минуты, 42 секунды (26.01.2009 - 22:14) twin написал(а):
Вообще то я давал совет не для Oracl'а, о нем речи тогда не было... А какие проблемы не решает отдельня таблица? Вроде как оно так и устроено. Другой вопрос - дальнейшая работа, допустим запрет на принудительный повтор, но это к формированию отношения не имеет.


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.