Ответ 1
Попробуйте выполнить следующую команду:
ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;
Попробуйте использовать тот же DB-пользователь, что и тот, который вы создали в таблице.
У меня есть таблица в PostgreSQL с 22 столбцами, и я хочу добавить первичный ключ автоматического увеличения.
Я попытался создать столбец с именем id
типа BIGSERIAL, но pgadmin ответил с ошибкой:
ERROR: sequence must have same owner as table it is linked to.
Кто-нибудь знает, как решить эту проблему? Как добавить создание автоматически увеличивающего первичный ключ в PostgreSQL без повторного создания таблицы?
Попробуйте выполнить следующую команду:
ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;
Попробуйте использовать тот же DB-пользователь, что и тот, который вы создали в таблице.
Шаг 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, выберите * из своей таблицы:
[email protected]$ 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'),
'Ethics is a scam created by poor people to manipulate rich people.'
);
Шаг 4, обратите внимание на строки
[email protected] ~ $ 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. Что красивее.
Если вы хотите сделать это в pgadmin, это намного проще. Кажется, что в postgressql добавляется автоматическое приращение к столбцу, сначала нам нужно создать последовательность автоматического увеличения и добавить ее в требуемый столбец. Мне это понравилось.
1) Во-первых, вам нужно убедиться, что для вашей таблицы есть первичный ключ. Также сохраните тип данных первичного ключа в bigint или smallint. (Я использовал bigint, не мог найти тип данных, называемый серийным, как упоминается в других ответах в другом месте)
2) Затем добавьте последовательность, щелкнув правой кнопкой мыши по последовательности- > добавить новую последовательность.
Если в таблице нет данных, оставьте последовательность как есть, не вносите никаких изменений. Просто сохраните его.
Если существуют существующие данные, добавьте последнее или самое большее значение в столбце первичного ключа в значение Текущее значение на вкладке "Определения", как показано ниже.
3) Наконец, добавьте строку nextval('your_sequence_name'::regclass)
в значение по умолчанию в вашем первичном ключе, как показано ниже.
Убедитесь, что имя последовательности верное. Это все и автоматическое приращение должно работать.
Возможно, я немного опаздываю, чтобы ответить на этот вопрос, но я работаю над этим вопросом на своей работе:)
Я хотел написать столбец "a_code" = c1, c2, c3, c4...
Сначала я открыл столбец с именем ref_id
и типом serial
.
Затем я решил проблему с помощью этой команды:
update myschema.mytable set a_code=cast('c'||"ref_id" as text)