相关疑难解决方法(0)

在没有表扫描的情况下向大表添加 NOT NULL 约束

尝试向NOT NULL具有 10 亿行的表添加约束。我无法承受超过几秒钟的表锁。有没有办法在alter table 语句期间防止全表扫描?我在列上创建了一个索引,希望它能被使用,但这似乎不起作用。可能是检查约束?其他选择?谢谢!

postgresql alter-table postgresql-9.3

14
推荐指数
2
解决办法
5613
查看次数

错误消息中缺少非空约束的名称

该关系是在 Postgres 9.6 中使用以下命令创建的:

 CREATE TABLE import_event (
   import_event_id BIGINT NOT NULL,
   filename VARCHAR (200) CONSTRAINT NN_import_event__filename NOT NULL
 );

 ALTER TABLE ONLY import_event ADD CONSTRAINT PK_import_cak_key PRIMARY KEY (import_event_id);
Run Code Online (Sandbox Code Playgroud)

请注意,not null 约束已命名。
然后执行了下面的命令

 insert into import_event (import_event_id) values (1);
Run Code Online (Sandbox Code Playgroud)

当然,约束违反错误被提出。消息内容如下

 ERROR:  null value in column "filename" violates not-null constraint
 DETAIL:  Failing row contains (1, null).**strong text**
Run Code Online (Sandbox Code Playgroud)

问题是该消息中缺少非空约束的名称。但是,正确的错误消息:

 ERROR:  new row for relation "import_event" violates check constraint "nn_import_event__filename"
Run Code Online (Sandbox Code Playgroud)

当非空约束声明如下时产生

 ALTER TABLE ONLY import_event ADD CONSTRAINT NN_import_event__filename CHECK(filename IS NOT NULL); …
Run Code Online (Sandbox Code Playgroud)

postgresql constraint postgresql-9.6

4
推荐指数
1
解决办法
1076
查看次数