2013-05-10 3 views
18

В pgsql есть способ иметь таблицу из нескольких значений и выбрать один из них (скажем, other_id), узнать, каково его максимальное значение, и сделать каждую новую запись, которая помещается в приращение таблицы из этого значения.Изменить тип данных столбца на последовательный

Я предполагаю, что это было слишком просто, чтобы имели возможность работать ..

ALTER TABLE address ALTER COLUMN new_id TYPE SERIAL 

____________________________________ 
ERROR: type "serial" does not exist 

Спасибо большое за любой проницательности!

+1

Может быть, вы могли бы объяснить немного больше о том, почему вам нужно добавить новый серийный идентификатор таблицы, по-видимому, уже имеет первичный ключ? Вы хотите заменить существующий первичный ключ на серийный идентификатор? Каков фон всего этого? –

+0

@CraigRinger В моем последнем вопросе у меня возникли проблемы с импортом db. Я решил, что, поскольку моя система нуждается в некоторых существенных обновлениях, чтобы справиться с этим в рабочее время завтра. Мне нужно только несколько таблиц. Поэтому я привел таблицу, но последовательность, которая контролировала увеличивающийся столбец внутри этой таблицы, является причиной проблемы при передаче. Мне не повезло, что столбец стал первичным ключом, поэтому я подумал, что могу сделать его «серийным», начиная с текущего максимального значения таблицы. Было бы проще сделать новый col и сделать его PrimKey? – 1252748

+0

Лучше всего ссылку на любые предыдущие вопросы, требуемые для соответствующего контекста. Как вы «передали» его? «не повезло» в каком смысле? Точные команды, точные сообщения об ошибках и т. Д. –

ответ

12

Быстрый взгляд на docs говорит вам, что

The data types smallserial, serial and bigserial are not true types but merely a notational convenience for creating unique identifier columns

Если вы хотите, чтобы сделать существующий столбец (целое число), чтобы работать как «последовательный», просто создать последовательность вручную (имя произвольно), установите его текущее значение максимально (или больше) вашего текущего значения address.new_id, чтобы установить его как значение по умолчанию для вашего столбца address.new_id.

Чтобы установить значение вашей последовательности, см. here.

SELECT setval('address_new_id_seq', 10000);

Это просто пример, использовать собственное имя последовательности (произвольное, вы создаете его), и число больше, чем максимальное текущее значение вашей колонки.


Update: как указал ответ Лукаса (который должен быть acccepted один), вы должны также указать, какой столбец последовательность „принадлежит“ с помощью CREATE/ALTER SEQUENCE ... OWNED BY ...

+0

в порядке. Что означает «установить текущее значение последовательности»? Сейчас я просматриваю последовательности, но они новы для меня. Вы хотите сказать, что через последовательность я могу создать свое собственное «нотационное удобство для уникальных столбцов идентификатора»? – 1252748

+0

Столбец серийного (псевдо) типа представляет собой целочисленный столбец, который по умолчанию задает значение некоторой последовательности (и увеличивает ее). Я добавил инструкцию для установки значения. – leonbloy

25

Посмотрите в PostGreSQL документации от datatype serial. Серийный - это только короткая рука.

CREATE TABLE tablename (
    colname SERIAL 
); 

эквивалентно заданию:

CREATE SEQUENCE tablename_colname_seq; 
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq') 
); 
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname; 
+0

Я должен был упомянуть, что это быстрое исправление, пока я не смогу обновить мою (только что узнав, как) древнюю версию postgre. Когда я пытаюсь выполнить 'OWNED BY', я получаю синтаксическую ошибку. – 1252748

+0

@thomas, так что же ваша версия postgres? – Lucas

Смежные вопросы