insert.............help

micolo

Новичок
insert.............help

Доброго времени суток! Подскажите пожалуйсто как сделать запрос с insert что бы после него можно было получить аналог mysql_insert_id. Смотрел предложенный faq, но там нет примера с inset'ом.
 

svetasmirnova

маленький монстрик
В PostgreSQL есть sequences. При создании поля типа SERIAL автоматически создаётся sequence. Её название тебе выдаст psql после выполнения инструкции create table. Их и надо использовать. Посмотри в мануале как. (Сейчас навру, как-то так: select currval('seq_name');, select nextval('seq_name');
 

micolo

Новичок
а если база была создана не мной, как я могу их определить
 

svetasmirnova

маленький монстрик
Ищи в мане по каким правилам они создаются: я не помню.

-~{}~ 07.11.05 17:32:

И вообще "если база была создана не мной" вполне возможно, что тип поля не SERIAL, а значение из sequence вставляется вручную
 

micolo

Новичок
да тип поля id не SERIAL и нет возможности его поменять
так как же тогда быть
 

svetasmirnova

маленький монстрик
А что тебе нужно? Конечный результат. Для чего аналог mysql_insert_id? Как реализовано добавление новой строки разработчиком базы?
 

mar

Новичок
Автор оригинала: micolo
да тип поля id не SERIAL и нет возможности его поменять
так как же тогда быть
ну что значит, не поменять?

способ нумер раз (для 8-ой ветки):
- BEGIN;
- ALTER TABLE RENAME COLUMN column TO new_column;
- потом создаем колонку
- переливаем данные из одной колонки в другую
- удаляем "лишнее"
- сиквенсы:
SELECT setval ('имя_нашей_таблицы_seq', ((SELECT id from имя_нашей_таблицы order by id desc limit 1) + 1));
(мне пришлось совсем недавно так извращаться, когда живую базу из mantis-а переливала из MySQL в PostgreSQL)
- проверяем (например INSERT-им туда что-то временное, потом DELETE эту запись)
- если все в порядке - COMMIT

Способ нумер два (годится и для более ранних версий постгреса и вообще имхо более щадящий:
- BEGIN;начинаем транзакцию
- создаем временную таблицу со всеми нашими полями, но делаем тип id SERIAL;
- переливаем туда нашу таблицу
- убиваем исходную таблицу
- переливаем нашу на ее место
- убиваем временную
- и, если сиквенс не заполнился, ... см выше
- проверяем (см выше)
- если все в порядке - COMMIT
 

mar

Новичок
svetasmirnova
Вопрос был
Автор оригинала: micolo
да тип поля id не SERIAL и нет возможности его поменять
так как же тогда быть
Т.е. насколько я понимаю, имеется некая рабочая база, в которой, не убивая данные, нужно сделать поле id одной из таблиц типом SERIAL.
Если понято неправильно - пардон :)
 

svetasmirnova

маленький монстрик
Ключевое слово:
>а если база была создана не мной
Плюс человек явно с sequences впервые столкнулся. Поэтому хотелось бы, чтобы он сначала понял, почему создатель базы не использовал SERIAL: PostgreSQL богатая возможностями база.
 

BOJIK

Новичок
Не знаю как в восьмерке, а в седьмом pgsql таблицы создаються с oid если не укажешь обратного, поэтому можно выбрать последнюю вставленную запись, используя такую конструкцию

SELECT * FROM my_table ORDER BY oid DESC LIMIT 1;
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: BOJIK
Не знаю как в восьмерке, а в седьмом pgsql таблицы создаються с oid если не укажешь обратного, поэтому можно выбрать последнюю вставленную запись, используя такую конструкцию

SELECT * FROM my_table ORDER BY oid DESC LIMIT 1;
Не надо давать плохих советов; в 8.1 таблицы уже по умолчанию без oid.
 

BOJIK

Новичок
Ну совет может и правда плох только у автора топика не восьмерка судя по вот этой строчке

Call to undefined function: pg_get_serial_sequence()

вот когда будет переходить на 8.1 решит задачу подругому.
 

svetasmirnova

маленький монстрик
А причём здесь версия? Интересен ответ на вопрос:
>Как реализовано добавление новой строки (генерация уникального id) разработчиком базы?
Вот от этого и надо плясать. Способов много.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: BOJIK
Ну совет может и правда плох только у автора топика не восьмерка судя по вот этой строчке

Call to undefined function: pg_get_serial_sequence()

вот когда будет переходить на 8.1 решит задачу подругому.
1) Афтар топика, судя по всему, тормоз, и пытался функцию запустить в скрипте PHP, а не в PostgreSQL.
2) Отмазываться будешь у следователя.
 
Сверху