如何一次将所有表列设置为NOT NULL?

时间:2019-09-27 12:48:00

标签: sql database postgresql schema

这甚至有可能吗?如果不是,那么我会满意于不需要一一键入每个列名的方法。我的用例是我从查询创建一个表,并希望使所有列都不为NULL,因为以后我使用Slick进行ORM,并且所有这些列类型都不为null(因此非Option [X] ])。这是静态数据,因此列值也不会为null,也不会更改。

与MySQL不同,Postgres不能弄清楚原始查询列已经全部不是NULL。

我想避免在脚本中一一添加约束,并且只要查询模式发生更改(即

),就容易破坏解决方案。
CREATE TABLE dentistry_procedure AS SELECT * FROM ...
ALTER TABLE dentistry_procedure ALTER column * SET NOT NULL;

如何?

1 个答案:

答案 0 :(得分:2)

您可以使用元数据表并建立动态查询:

SELECT format('ALTER TABLE %I '||STRING_AGG(format('ALTER COLUMN %I SET NOT NULL', COLUMN_NAME),CHR(13)||',')
              , MIN(TABLE_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE IS_NULLABLE = 'YES'
  AND TABLE_NAME = 't';

db<>Fiddle demo