我有一张桌子,我想要only one entry张.因此,如果有人试图插入另一行,只有在有人删除了之前存在的行之后,才应该允许插入另一行.

我该如何为这样的桌子设定规则?

推荐答案

UNIQUE约束允许多行有NULL个值,因为两个NULL值永远不会被认为是相同的.

类似的考虑也适用于CHECK个约束.它们允许表达式为TRUENULL(而不是FALSE).同样,NULL个值通过了判断.

为了排除这种可能性,将must列定义为NOT NULL.或者将其设为PRIMARY KEY,因为PK列是自动定义的NOT NULL.细节:

此外,只需使用boolean:

CREATE TABLE public.onerow (
   onerow_id bool PRIMARY KEY DEFAULT TRUE
 , data text
 , CONSTRAINT onerow_uni CHECK (onerow_id)
);

对于boolean列,CHECK约束可能就这么简单.只允许TRUE人.

您可能希望从public(以及所有其他角色)中删除REVOKE(或不是GRANT)DELETETRUNCATE权限,以防止删除单行.比如:

REVOKE DELETE, TRUNCATE ON public.onerow FROM public;

Postgresql相关问答推荐

利用PostgreSQL查询中表的顺序来计算包含每次时间的时间范围

如何使用Docker安装PostgreSQL扩展

我无法在过程中提交

Postgres 11没有强制执行外键约束?

在Postgre中的链接服务器上执行远程查询

当参数大小超过 393166 个字符时,PSQL 准备语句查询挂起

是否可以短时间运行 VACUUM FULL 并获得一些好处?

postgres 如何计算多列哈希?

连接 Supbase Postgresql 数据库时,Stepzen Graphiql 资源管理器中的主机名解析错误

PostgreSQL:please specify covering index name是什么意思

无法向 postgresql 数据库授予用户权限(对于 rails 应用程序)

遇到序列化失败的条件是什么?

如果 PostgreSQL 数据库中存在,则删除表

查询仅属于特定部门的用户

PostgreSQL:如何安装 plpythonu 扩展

如何将参数值添加到 pgadmin sql 查询?

使用 pg_dump 和 psql -U postgres db_name < ... 移动数据库会导致ERROR: relation "table_name" does not exist

子查询的自连接

与 iexact 一起使用时,Django get_or_create 无法设置字段

Ruby 中 DateTime 的毫秒分辨率