我有一张我想要的桌子只有一项。因此,如果有人尝试插入另一行,则只有在有人删除了先前存在的行之后才允许插入另一行。
如何为这样的表设置规则?
A UNIQUE
约束允许多行null
值,因为两个null
值不被认为是相同的。 (除非使用时NULLS NOT DISTINCT在 Postgres 15 中 https://stackoverflow.com/a/8289253/939860或稍后。)
类似的考虑适用于CHECK
限制。他们允许表达式为true
or null
(只是不false
)。再次,null
值通过了检查。
要排除这种情况,请定义列NOT NULL
。或者将其设为PRIMARY KEY
由于 PK 列已定义NOT NULL
自动地。看:
- 为什么我可以在可为空的列上创建带有主键的表? https://stackoverflow.com/questions/20006374/why-can-i-create-a-table-with-primary-key-on-a-nullable-column/20006502#20006502
另外,只需使用boolean
:
CREATE TABLE public.onerow (
onerow_id bool PRIMARY KEY DEFAULT true
, data text
, CONSTRAINT onerow_uni CHECK (onerow_id)
);
The CHECK
约束可以如此简单boolean
柱子。仅有的true
被允许。
你可能想要REVOKE https://www.postgresql.org/docs/current/sql-revoke.html(或不GRANT
) the DELETE
and TRUNCATE
特权来自public
(以及所有其他角色)以防止单行被删除。喜欢:
REVOKE DELETE, TRUNCATE ON public.onerow FROM public;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)