У меня есть таблица в PostgreSQL с 22 столбцами, и я хочу добавить первичный ключ с автоинкрементом.
Я попытался создать столбец с именем id
типа BIGSERIAL, но pgadmin ответил с ошибкой:
ERROR: sequence must have same owner as table it is linked to.
Кто-нибудь знает, как решить эту проблему? Как добавить автоинкрементный первичный ключ в PostgreSQL без повторного создания таблицы?
sql
postgresql
MKN
источник
источник
ALTER TABLE mytable ADD PRIMARY KEY (column);
. Postgresql проверит, что столбец не содержит NULL.bigserial
иserial
дают ту же ошибку:ERROR: syntax error at or near "BIGSERIAL"
Автоинкрементный первичный ключ в postgresql:
Шаг 1, создайте свою таблицу:
Шаг 2, вставьте значения в вашу таблицу, как это, обратите внимание, что mytable_key не указан в первом списке параметров, это приводит к автоинкременту последовательности по умолчанию.
Шаг 3, выберите * из таблицы:
Шаг 4, интерпретировать вывод:
Обратите внимание, что столбец mytable_key был автоматически увеличен.
ProTip:
Вы всегда должны использовать первичный ключ в своей таблице, потому что postgresql внутренне использует структуры хеш-таблиц для увеличения скорости вставки, удаления, обновления и выбора. Если доступен столбец первичного ключа (который принудительно уникален и не равен нулю), он может зависеть от обеспечения уникального начального числа для хэш-функции. Если столбец первичного ключа недоступен, хеш-функция становится неэффективной, поскольку она выбирает некоторый другой набор столбцов в качестве ключа.
источник
SERIAL
создаетsequence
закулисную ситуациюthing_id int references epictable(mytable_key)
работой?Создайте автоинкрементный первичный ключ в postgresql, используя пользовательскую последовательность:
Шаг 1, создайте свою последовательность:
Шаг 2, создайте свою таблицу
Шаг 3, вставьте в свой стол
Шаг 4, наблюдаем за строками
Две строки имеют ключи, которые начинаются с 1 и увеличиваются на 1, как определено в последовательности.
Бонус Elite ProTip:
Программисты ненавидят печатать, а печатать
nextval('splog_adfarm_seq')
это раздражает.DEFAULT
Вместо этого вы можете ввести этот параметр, например так:Чтобы вышеприведенное сработало, вы должны определить значение по умолчанию для этого ключевого столбца в таблице splog_adfarm. Который красивее.
источник
Если вы хотите сделать это в pgadmin, это намного проще. Кажется, в postgressql, чтобы добавить автоинкремент к столбцу, нам сначала нужно создать последовательность автоинкремента и добавить ее в необходимый столбец. Мне так понравилось.
1) Во-первых, вам нужно убедиться, что для вашей таблицы есть первичный ключ. Также сохраните тип данных первичного ключа в bigint или smallint. (Я использовал bigint, не смог найти тип данных, называемый serial, как упоминалось в других ответах в другом месте)
2) Затем добавьте последовательность, щелкнув правой кнопкой мыши по последовательности -> добавить новую последовательность . Если в таблице нет данных, оставьте последовательность как есть, не вносите никаких изменений. Просто сохрани это. Если данные существуют, добавьте последнее или наибольшее значение в столбце первичного ключа к значению «Текущее значение» на вкладке «Определения», как показано ниже.
3) Наконец, добавьте строку
nextval('your_sequence_name'::regclass)
к значению Default в вашем первичном ключе, как показано ниже.Убедитесь, что имя последовательности здесь правильно. Это все, и автоматическое увеличение должно работать.
источник
Если вы хотите использовать числа в последовательности, определите новую последовательность с чем-то вроде
а затем измените таблицу, чтобы использовать последовательность для идентификатора:
источник
Я попытался следующий сценарий, чтобы успешно автоматически увеличить первичный ключ в PostgreSQL.
РЕДАКТИРОВАТЬ:
Ключевое слово SERIAL автоматически создает последовательность для соответствующего столбца.
источник
ALTER SEQUENCE dummytable_id_seq RESTART WITH 1;
и работает.Может быть, я немного опоздал, чтобы ответить на этот вопрос, но я работаю над этим вопросом на моей работе :)
Я хотел написать столбец 'a_code' = c1, c2, c3, c4 ...
Сначала я открыл столбец с именем
ref_id
и типомserial
. Затем я решил свою проблему с помощью этой команды:источник