首页 > 解决方案 > 如何保证一张表只有一行一列?

问题描述

使用 PostgreSQL 11.5。我需要允许一个表只允许其中的一行和一列(不是 0 或 2,正好是 1)。我觉得ADD CONSTRAINT会有用,但我不知道该怎么做。

我希望能够在需要时更新这一行。

使以下内容有效的东西:

 foo
-----
 bar

但不是以下内容:

 foo | baz
-----+-----
 bar | bin
-----+-----
     | gar

标签: sqlpostgresqldatabase-designpermissionscheck-constraints

解决方案


您可以强制一个表只有一行CHECK对您的主键(或任何其他唯一且不可为空的列)设置约束,如下所示:

ALTER TABLE <tablename> ADD CONSTRAINT [<name>] CHECK ([pk/unique field] = [constant value]);

无论如何,由于您想要一个可更新的字段,您需要使用一个包含 2 列的表。如果您真的只需要一行(并且foo为此目的仅选择或创建视图不是一种选择),您还可以在插入和删除时使用触发器(并通过引发异常来拒绝其中的任何操作)。为避免出现空表(不确定是否需要),您还需要在删除时使用此触发器,约束不够强。有关触发器,请参见此处:https ://www.postgresql.org/docs/current/triggers.html

要避免任何进一步ALTER TABLE的命令(例如添加列)和DROP TABLE,请使用事件触发器。有关更多信息,请查看文档:https ://www.postgresql.org/docs/current/event-triggers.html

对于使用带有触发器的 PL/pgSQL,还可以查看https://www.postgresql.org/docs/current/plpgsql-trigger.html


推荐阅读