Как установить автоинкрементный первичный ключ в PostgreSQL? - PullRequest
248 голосов
/ 11 октября 2011

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

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

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

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

Ответы [ 7 ]

274 голосов
/ 11 октября 2011

Попробуйте эту команду:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

Попробуйте это с тем же пользователем БД, который у вас есть созданным таблицей.

245 голосов
/ 17 октября 2012

Автоинкрементный первичный ключ в 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 внутренне использует структуры хеш-таблиц для увеличения скорости вставок, удалений, обновлений и выборок.Если доступен столбец первичного ключа (который принудительно уникален и не равен нулю), он может зависеть от предоставления уникального начального числа для хэш-функции.Если столбец первичного ключа недоступен, хеш-функция становится неэффективной, так как она выбирает какой-то другой набор столбцов в качестве ключа.

33 голосов
/ 02 ноября 2012

Создание автоинкрементного первичного ключа в 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'), 
    'Will the smart cookies catch the crumb?  Find out now!'
);

Шаг 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 | Will the smart cookies catch the crumb?  Find out now!
(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. Что красивее.

16 голосов
/ 30 октября 2015

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

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

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

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

enter image description here Убедитесь, что имя последовательности здесь правильно. Это все, и автоинкремент должен работать.

3 голосов
/ 06 февраля 2018

Если вы хотите использовать числа в последовательности, задайте новую последовательность, например,

CREATE SEQUENCE public.your_sequence
    INCREMENT 1
    START 1
    MINVALUE 1
;

, а затем измените таблицу, чтобы использовать последовательность для идентификатора:

ALTER TABLE ONLY table ALTER COLUMN id SET DEFAULT nextval('your_sequence'::regclass);
0 голосов
/ 03 января 2019

Я попробовал следующий скрипт, чтобы успешно автоматически увеличить первичный ключ в PostgreSQL.

CREATE SEQUENCE dummy_id_seq
    START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

CREATE table dummyTable (
    id bigint DEFAULT nextval('dummy_id_seq'::regclass) NOT NULL,
    name character varying(50)
);
0 голосов
/ 25 января 2016

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

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

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

update myschema.mytable set a_code=cast('c'||"ref_id" as text) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...