Как последовательно использовать nextval с помощью node-postgres

моя база данных таблицы postgres имеет ключ автоматического увеличения.

В обычном postgres sql я могу:

INSERT INTO CITY(ID,NAME) VALUES(nextval('city_sequence_name'),'my first city');

Как я могу сделать это с помощью node-postgres? До сих пор я пробовал:

myConnection.query('INSERT INTO city(id,name) VALUES ($1,$2)', ['nextval("city_sequence_name")','my first city'],callback);

Но правила ошибки:

erro { ошибка: синтаксис ввода недействителен для целого числа: "nextval("city_sequence_name")"


person joelton    schedule 09.04.2017    source источник
comment
попробуйте изменить 'nextval("city_sequence_name")' на"nextval('city_sequence_name')"   -  person Vao Tsun    schedule 09.04.2017
comment
Я только что попробовал это. Опять та же ошибка. Извини   -  person joelton    schedule 09.04.2017
comment
Почему бы тогда просто не пропустить столбец? - INSERT INTO CITY(NAME) VALUES('my first city');. Вот как обычно позволяют автоматически сгенерированным столбцам генерировать новое значение. В качестве альтернативы можно сделать INSERT INTO CITY(ID, NAME) VALUES(DEFAULT, 'my first city');.   -  person vitaly-t    schedule 10.04.2017


Ответы (2)


Итак, я смог найти решение для этого случая:

connection.query("INSERT INTO city(id,name) VALUES(nextval('sequence_name'),$1)", ['first city'],callback);
person joelton    schedule 09.04.2017

Это плохая практика. Вместо этого просто установите для столбца значение DEFAULT nextval() или используйте тип serial.

# CREATE TABLE city ( id serial PRIMARY KEY, name text );
CREATE TABLE
# \d city
                         Table "public.city"
 Column |  Type   |                     Modifiers                     
--------+---------+---------------------------------------------------
 id     | integer | not null default nextval('city_id_seq'::regclass)
 name   | text    | 
Indexes:
    "city_pkey" PRIMARY KEY, btree (id)

# INSERT INTO city (name) VALUES ('Houston'), ('Austin');
INSERT 0 2
test=# TABLE city;
 id |  name   
----+---------
  1 | Houston
  2 | Austin
(2 rows)
person Evan Carroll    schedule 09.04.2017
comment
почему это плохая практика? плохо справляется с вставкой последовательности в код приложения? - person Gaetano Piazzolla; 31.01.2021
comment
@GaetanoPiazzolla, потому что как часто вы хотите, чтобы столбец, представляющий последовательность, по умолчанию использовал что-либо, кроме следующего значения в этой последовательности? И если по умолчанию используется следующее значение, зачем вам явно указывать значение по умолчанию в коде приложения? Более того, новый способ сделать это даже не предоставляет пользователю nextval(), поскольку он использует стандартизированные IDENTITY COLUMN. - person Evan Carroll; 01.02.2021
comment
Я думаю, вы правы. .... - person Gaetano Piazzolla; 02.02.2021
comment
Одна вещь, которую вы, возможно, не учли: если вы используете java и JPA - библиотека использует предварительное выделение next val для последовательностей, так что ей не нужно запускать новый nextVal каждый раз, когда он вставляет новый ряд :) - person Gaetano Piazzolla; 06.02.2021