ROWID-эквивалент в postgres 9.2

Есть ли способ получить rowid записи в postgres??

В oracle я могу использовать как

SELECT MAX(BILLS.ROWID) FROM BILLS  

Ответ 1

Да, есть столбец ctid, который эквивалентен для rowid. Но это бесполезно для вас. Rowid и ctid являются физическими идентификаторами строк/кортежей => могут меняться после перестроения/вакуума.

См.: Глава 5. Определение данных> 5.4. Системные столбцы

Ответ 2

Оконная функция PostgreSQL row_number() может использоваться для большинства целей, где вы бы использовали rowid. В то время как в Oracle rowid является внутренней нумерацией строк результирующих данных, в Postgres row_number() вычисляет нумерацию в пределах логического порядка возвращаемых данных. Обычно, если вы хотите нумеровать строки, это означает, что вы ожидаете их в определенном порядке, поэтому вы должны указать, какой столбец (столбцы) упорядочить строки при их нумерации:

select client_name, row_number() over (order by date) from bills;

Если вы просто хотите, чтобы строки были пронумерованы произвольно, вы можете оставить предложение over пустым:

select client_name, row_number() over () from bills;

Если вы хотите вычислить агрегат по номеру строки, вам нужно использовать подзапрос:

select max(rownum) from (
    select row_number() over () as rownum from bills
) r;

Если все, что вам нужно, это последний элемент таблицы, и у вас есть столбец для последовательной сортировки, то существует более простой подход, чем использование row_number(). Просто измените порядок сортировки и выберите первый элемент:

select * from bills 
order by date desc limit 1;

Ответ 4

Добавьте любой столбец в таблицу (имя может быть rowid). И не изменяйте его, создав триггер ДО ПЕРЕДАЧИ UPDATE, который вызовет исключение, если кто-то попытается обновить. Вы можете заполнить этот столбец последовательностью, как указано @JohnMudd.

Ответ 5

SELECT MAX(ctid)
FROM table_name;