Я смотрю на создание таблицы PostgreSQL, и я наткнулся на это:
CREATE TABLE (
...
) WITH ( OIDS = FALSE );
Я прочитал документацию, предоставленную postgres, и я знаю концепцию идентификатора объекта из ООП, но все же я не понимаю,
OIDs в основном предоставляют вам встроенный, глобально уникальный идентификатор для каждой строки, содержащийся в системном столбце (в отличие от столбца пользовательского пространства). Это удобно для таблиц, в которых у вас нет первичного ключа, есть повторяющиеся строки и т.д. Например, если у вас есть таблица с двумя одинаковыми строками, и вы хотите удалить самую старую из двух, вы можете сделать это, используя oid.
По моему опыту, эта функция обычно не используется в большинстве приложений, поддерживающих postgres (возможно, частично потому, что они нестандартные), и их использование по существу устарели:
В PostgreSQL 8.1 default_with_oids является по умолчанию; в предыдущих версиях PostgreSQL, он был включен по умолчанию.
Использование OID в пользовательских таблицах считается устаревшим, поэтому большинство установки должны оставить это переменная отключена. Приложения, которые требуют OID для конкретной таблицы следует указать WITH OIDS при создании стол. Эта переменная может быть включен для совместимости со старыми приложения, которые не следуют поведение.
OID все еще используются для Postgres с большими objects (хотя некоторые люди утверждают, что крупные объекты вообще не полезны). Они также широко используются системные таблицы. Они используются, например, TOAST, который хранит более 8 КБ BYTEA (и т.д.) в отдельную область хранения (прозрачно), которая используемый по умолчанию всеми таблицами. Их прямое использование, связанное с "обычными" пользовательскими таблицами, в основном устарело.
В настоящее время тип oid реализуется как четырехзначное целое число без знака. Поэтому он недостаточно велик, чтобы обеспечить уникальность базы данных в больших базах данных или даже в больших отдельных таблицах. Таким образом, использование созданного пользователем столбца OID таблицы в качестве первичного ключа не рекомендуется. OID лучше всего использовать только для ссылок на системные таблицы.
По-видимому, последовательность OID "делает" завершена, если она превышает 4B 6. Таким образом, по сути, это глобальный счетчик, который можно обернуть. Если он завершается, некоторое замедление может начаться, когда оно используется, и "поиск" для уникальных значений и т.д.
См. также https://wiki.postgresql.org/wiki/FAQ#What_is_an_OID.3F
Чтобы удалить все OID из таблиц базы данных, вы можете использовать этот Linux script:
Сначала войдите в систему как суперпользователь PostgreSQL:
sudo su postgres
Теперь запустите этот script, изменив YOUR_DATABASE_NAME с вашим именем базы данных:
for tbl in `psql -qAt -c "select schemaname || '.' || tablename from pg_tables WHERE schemaname <> 'pg_catalog' AND schemaname <> 'information_schema';" YOUR_DATABASE_NAME` ; do psql -c "alter table $tbl SET WITHOUT OIDS" YOUR_DATABASE_NAME ; done
Я использовал этот script для удаления всех моих OID, поскольку Npgsql 3.0 не работает с этим, и это не важно для PostgreSQL.