Как установить автоинкрементный первичный ключ в PostgreSQL?

197

У меня есть таблица в PostgreSQL с 22 столбцами, и я хочу добавить первичный ключ автоматического увеличения.

Я попытался создать столбец с именем id типа BIGSERIAL, но pgadmin ответил с ошибкой:

ERROR: sequence must have same owner as table it is linked to.

Кто-нибудь знает, как решить эту проблему? Как добавить создание автоматически увеличивающего первичный ключ в PostgreSQL без повторного создания таблицы?

Теги:

5 ответов

226
Лучший ответ

Попробуйте выполнить следующую команду:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

Попробуйте использовать тот же DB-пользователь, что и тот, который вы создали в таблице.

  • 65
    (здесь ключ заключается в использовании типа данных SERIAL или BIGSERIAL, который создает закулисную последовательность и увеличивает / использует ее во время вставки)
  • 14
    и если вы хотите сослаться на него из другой таблицы, используйте integer или bigint
Показать ещё 9 комментариев
224

Автоматическое увеличение первичного ключа в postgresql:

Шаг 1, создайте таблицу:

CREATE TABLE epictable
(
    mytable_key    serial primary key,
    moobars        VARCHAR(40) not null,
    foobars        DATE
);

Шаг 2, вставьте значения в таблицу как это, обратите внимание, что mytable_key не указан в списке первых параметров, это приводит к автоматической инициализации последовательности по умолчанию.

insert into epictable(moobars,foobars) values('delicious moobars','2012-05-01')
insert into epictable(moobars,foobars) values('worldwide interblag','2012-05-02')

Шаг 3, выберите * из своей таблицы:

el@voyager$ psql -U pgadmin -d kurz_prod -c "select * from epictable"

Шаг 4, интерпретируем вывод:

mytable_key  |        moobars        |  foobars   
-------------+-----------------------+------------
           1 | delicious moobars     | 2012-05-01
           2 | world wide interblags | 2012-05-02
(2 rows)

Обратите внимание, что столбец mytable_key был автоматически увеличен.

ProTip:

Вы всегда должны использовать первичный ключ в своей таблице, потому что postgresql внутренне использует структуры хэш-таблицы для увеличения скорости вставки, удаления, обновления и выбора. Если доступен столбец первичного ключа (который является принудительным уникальным и не равным нулю), его можно использовать для предоставления уникального семпла для хэш-функции. Если столбцы первичного ключа недоступны, хеш-функция становится неэффективной, поскольку она выбирает какой-либо другой набор столбцов в качестве ключа.

  • 21
    Незначительная мелочь, SERIAL создает sequence за кулисами: postgresql.org/docs/9.2/static/…
  • 0
    Можно ли сделать первичный ключ (существующий столбец) в таблице без добавления какого-либо нового столбца
Показать ещё 1 комментарий
24

Создайте автоматически увеличивающий первичный ключ в postgresql, используя пользовательскую последовательность:

Шаг 1, создайте свою последовательность:

create sequence splog_adfarm_seq
    start 1
    increment 1
    NO MAXVALUE
    CACHE 1;
ALTER TABLE fact_stock_data_detail_seq
OWNER TO pgadmin;

Шаг 2, создайте таблицу

CREATE TABLE splog_adfarm
(
    splog_key    INT unique not null,
    splog_value  VARCHAR(100) not null
);

Шаг 3, вставьте в таблицу

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Is your family tree a directed acyclic graph?'
);

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Ethics is a scam created by poor people to manipulate rich people.'
);

Шаг 4, обратите внимание на строки

el@defiant ~ $ psql -U pgadmin -d kurz_prod -c "select * from splog_adfarm"

splog_key |                            splog_value                             
----------+--------------------------------------------------------------------
        1 | Is your family tree a directed acyclic graph?
        2 | Ethics is a scam created by poor people to manipulate rich people.
(3 rows)

В двух рядах есть ключи, которые начинаются с 1 и увеличиваются на 1, как определено последовательностью.

Бонус Elite ProTip:

Программисты ненавидят печатание, а ввод nextval('splog_adfarm_seq') вызывает раздражение. Вы можете ввести DEFAULT для этого параметра, например:

insert into splog_adfarm values (
    DEFAULT, 
    'Sufficient intelligence to outwit a thimble.'
);

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

  • 2
    Каковы преимущества пользовательских последовательностей? Возможно, безопасность?
  • 1
    @Masi Одним из вариантов использования пользовательской последовательности может быть упрощение репликации master-master, что может быть полезно в случае разрыва канала передачи данных между двумя центрами обработки данных, что позволяет создавать записи на обоих серверах с разными идентификаторами, что затем упрощает синхронизацию баз данных, сохраняя идентификаторы, созданные в разных местах.
11

Если вы хотите сделать это в pgadmin, это намного проще. Кажется, что в postgressql добавляется автоматическое приращение к столбцу, сначала нам нужно создать последовательность автоматического увеличения и добавить ее в требуемый столбец. Мне это понравилось.

1) Во-первых, вам нужно убедиться, что для вашей таблицы есть первичный ключ. Также сохраните тип данных первичного ключа в bigint или smallint. (Я использовал bigint, не мог найти тип данных, называемый серийным, как упоминается в других ответах в другом месте)

2) Затем добавьте последовательность, щелкнув правой кнопкой мыши по последовательности- > добавить новую последовательность.  Если в таблице нет данных, оставьте последовательность как есть, не вносите никаких изменений. Просто сохраните его. Если существуют существующие данные, добавьте последнее или самое большее значение в столбце первичного ключа в значение Текущее значение на вкладке "Определения", как показано ниже. Изображение 4112

3) Наконец, добавьте строку nextval('your_sequence_name'::regclass) в значение по умолчанию в вашем первичном ключе, как показано ниже.

Изображение 4113 Убедитесь, что имя последовательности верное. Это все и автоматическое приращение должно работать.

0

Возможно, я немного опаздываю, чтобы ответить на этот вопрос, но я работаю над этим вопросом на своей работе:)

Я хотел написать столбец "a_code" = c1, c2, c3, c4...

Сначала я открыл столбец с именем ref_id и типом serial. Затем я решил проблему с помощью этой команды:

update myschema.mytable set a_code=cast('c'||"ref_id" as text) 
  • 0
    Можно ли сделать первичный ключ (существующий столбец) в таблице без добавления какого-либо нового столбца

Ещё вопросы

Сообщество Overcoder
Наверх
Меню