暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

pg 18的not null 约束

原创 张超 2025-04-09
193

pg 18的not null 约束

在pg 17中,我们在创建约束的时候不支持约束暂时不生效,但是18中提供了此功能:
下面是相关测试:
首先 pg17中:

zc=# select version();
version

PostgreSQL 17.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
(1 row)

zc=# drop table t;
DROP TABLE
zc=# create table t ( a int not null, b text );
CREATE TABLE
zc=# \d t
Table “public.t”
Column | Type | Collation | Nullable | Default
--------±--------±----------±---------±--------
a | integer | | not null |
b | text | | |

zc=# insert into t select null,1 from generate_series(1,2);
ERROR: null value in column “a” of relation “t” violates not-null constraint
DETAIL: Failing row contains (null, 1).
通过上面的测试可以看到我们默认情况下pg会检查 not null约束,影响了我们的数据插入。

pg 18中的测试情况:
我们可以先不加not null 约束,等插入数据后添加 not null 约束但是 not valid
修改数据都正常后再使他valid

postgres=# select version();
version

PostgreSQL 18devel on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.3.1 20191121 (Red Hat 8.3.1-5), 64-bit
(1 row)

postgres=# drop table t;
DROP TABLE
postgres=# create table t ( a int, b text );
CREATE TABLE
postgres=# insert into t select null,1 from generate_series(1,2);
INSERT 0 2
postgres=# alter table t add constraint c1 not null a not valid;
ALTER TABLE
postgres=# select * from t;
a | b
—±–
| 1
| 1
(2 rows)

postgres=# update t set a = 1;
UPDATE 2
postgres=# alter table t validate constraint c1;
ALTER TABLE
postgres=# insert into t values (null, ‘a’);
ERROR: null value in column “a” of relation “t” violates not-null constraint
DETAIL: Failing row contains (null, a).

pg 17测试相关语法:
zc=# select version();
version

PostgreSQL 17.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
(1 row)

zc=# drop table t;
DROP TABLE
zc=# create table t ( a int, b text );
CREATE TABLE
zc=# insert into t select null,1 from generate_series(1,2);
INSERT 0 2
zc=# alter table t add constraint c1 not null a not valid;
ERROR: syntax error at or near “not”
LINE 1: alter table t add constraint c1 not null a not valid;

可以看到pg17中相关语法是暂时不支持的。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论