Как изменить существующий тип COLUMN на SERIAL в postgres? - PullRequest
1 голос
/ 18 января 2020

Следующий оператор не работает:

ALTER TABLE my_table
ALTER COLUMN column_id set default nextval('my_table_column_id_seq');

Так как изменить столбец id на автоинкремент?

Ошибка:

null value in column \"column_id"\ violates non null constraint.

Это происходит, когда Я вставляю без column_id. Мне нужно, чтобы это было автоматическое увеличение. Postgres Версия 12. 12.

Моя вставка:

INSERT INTO my_table (column2, column3)
VALUES ('rndmstring', 5);

Ответы [ 2 ]

1 голос
/ 18 января 2020

Вы можете создать последовательность, начиная с максимального значения +1 из существующих значений для column_id:

CREATE SEQUENCE my_table_column_id_seq START WITH <MAX VALUE OF column_id+1>;

после проверки, если этот запрос

SELECT 1
  FROM my_table
 HAVING COUNT(distinct column_id)=COUNT(column_id)
    AND SUM(CASE WHEN column_id IS NULL THEN 0 ELSE 1 END)=
        SUM(CASE WHEN column_id IS NULL THEN 1 ELSE 1 END);

возвращает 1 для не- null и уникальность значений соответствующего столбца, а затем используйте существующую команду

ALTER TABLE my_table
ALTER COLUMN column_id SET DEFAULT nextval('my_table_column_id_seq');

и убедитесь, что все существующие значения для column_id уникальны, затем введите:

ALTER TABLE my_table ADD PRIMARY KEY(column_id);

Демо

0 голосов
/ 18 января 2020

Решил это. У меня был идентификатор в качестве параметра в моей конечной точке для создания новой таблицы.

Итак, вместо этой nodejs конечной точки:

exports.createMy_table = async (column_id, column2, column3) => {
  try {
    const result = await client.query(
      "INSERT INTO my_table (column_id, column2, column3) VALUES ($1, $2, $3
      [column_id, column2, column3]
    );
    return result.rows;
  } catch (err) {
    throw new Error(err);
  }
};

я создаю без идентификатора.

 exports.createMy_table = async (column2, column3) => {
      try {
        const result = await client.query(
          "INSERT INTO my_table (column2, column3) VALUES ($1, $2,
          [column2, column3]
        );
        return result.rows;
      } catch (err) {
        throw new Error(err);
      }
    };
...