首页 > 解决方案 > 如何在 postgres 中将现有的 COLUMN 类型更改为 SERIAL?

问题描述

以下语句不起作用:

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。

我的插入:

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

标签: postgresqlsequenceddlpostgresql-12

解决方案


您可以从 column_id 现有值的最大值 +1 开始创建序列:

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,然后使用您现有的命令

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);

Demo


推荐阅读