如何将 PostgreSQL 10 标识列添加到带有行的现有表中?

Ion*_*scu 6 postgresql alter-table identity postgresql-10

我有一个包含一些行的表,我尝试使用以下命令添加一个标识列:

ALTER TABLE sourceTable 
    ADD COLUMN ogc_fid int                
        GENERATED BY DEFAULT AS IDENTITY;
Run Code Online (Sandbox Code Playgroud)

建议使用上面的命令来回答这个问题:

但我得到:

错误:“ogc_fid”列包含空值
SQL 状态:23502

看起来表的现有行没有自动生成标识,但会导致此错误(如果表没有行,该命令可以正常工作)。有任何想法吗?我是否必须首先为我添加的列生成值DEFAULT nextval('some_sequence')?或者在 PostgreSQL 10 中有更好的方法吗?

Erw*_*ter 5

我无法用当前的 Postgres 10.3 重现这个。(这个错误永远不会发生。)简单的测试:

dbfiddle在这里

怀疑您正在运行过时的点发布。Postgres 10.2修复了一些完全适合您的情况的错误。手册:

  • 修复各种失败以在插入标识列时应用正确的默认值(Michael Paquier、Peter Eisentraut)

    在几个上下文中,特别是COPYALTER TABLE ADD COLUMN,没有应用预期的默认值,而是插入了一个空值。

如果是这样,升级应该可以解决您的问题。
考虑项目政策

我们始终建议所有用户针对正在使用的任何主要版本运行最新的可用次要版本。

  • 你是对的,在我升级到 10.3.1 之后,查询工作正常,并且使用自动生成的值成功添加了标识列。谢谢! (2认同)