Как установить первичный ключ auto increment в PostgreSQL?
у меня есть таблица в PostgreSQL с 22 столбцами, и я хочу добавить первичный ключ автоматического приращения.
Я попытался создать столбец с именем id
типа BIGSERIAL, но pgadmin ответил с ошибкой:
ERROR: sequence must have same owner as table it is linked to.
кто-нибудь знает как исправить эту проблему? Как добавить создание автоматически увеличивающегося первичного ключа в PostgreSQL без повторного воссоздания таблицы?
6 ответов
попробуйте эту команду:
ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;
попробуйте с тем же DB-user, что и у вас создано столе.
автоматическое увеличение первичного ключа в 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, Как определено последовательность.
Бонус Элита 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) затем добавьте последовательность, щелкнув правой кнопкой мыши на последовательности ->добавить новую последовательность. Если в таблице нет данных, оставьте последовательность как есть, не вносите никаких изменений. Просто сохрани это. Если существуют данные, добавьте последнее или наибольшее значение в столбце первичный ключ к текущему значению на вкладке определения, как показано ниже.
3)наконец, добавьте строку nextval('your_sequence_name'::regclass)
к значению по умолчанию в вашем первичном ключе, как показано ниже.
Убедитесь,что имя последовательности правильно. Это все, и auto increment должен работать.
Если вы хотите использовать числа в последовательности, определите новую последовательность с чем-то вроде
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)