postgresql - 如何在 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);
解决方案
您可以从 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);
推荐阅读
- c# - 在与 EF Core 一起使用之前更改单个字段值
- php - 将自定义字段插入自定义帖子类型
- reactjs - CRA:将特别大的模块提取到单独的块中?
- php - 在 bitmex API 中更改 SYMBOL CONST
- sql - 使用 JSON1 跨多个表聚合 SQLite 查询
- node.js - 错误 TS2322:类型“任何”不可分配给类型“从不”
- python - 插入表并得到错误: sqlite3.ProgrammingError: You did not provide a value for binding 1
- python - Tkinter - 要求用户输入整数,直到他们在 tkinter 输入框中给出有效响应
- vue.js - 如何解决已分配计算属性但在 vue api 组合中没有设置器的问题?
- codenameone - Codenameone: start() 方法并不总是在应用程序恢复时调用