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



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



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



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


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

1033   6  

6 ответов:

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

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

попробуйте его с тем же пользователем БД, что и у вас создано столе.

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

создайте автоматический инкрементный первичный ключ в 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. Что еще красивее.

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

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

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

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

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

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

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

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

ALTER TABLE ONLY table ALTER COLUMN id SET DEFAULT nextval('your_sequence'::regclass);

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

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

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

update myschema.mytable set a_code=cast('c'||"ref_id" as text) 

Comments

    Ничего не найдено.