我有一张桌子,我希望只有一个条目。因此,如果有人试图插入另一行,则只有在有人删除了以前存在的行之后才允许这样做。
如何为这样的表设置规则?
答案 0 :(得分:20)
UNIQUE
约束允许多行NULL
值,因为两个NULL
值永远不会被认为是相同的。
类似的注意事项适用于CHECK
约束。它们允许表达式为TRUE
或NULL
(不是FALSE
)。同样,NULL
值超过了支票。
要排除这一点,必须 列定义NOT NULL
。或者将其设为PRIMARY KEY
,因为PK列会自动定义NOT NULL
。详细说明:
另外,只需使用boolean
:
CREATE TABLE onerow (
onerow_id bool PRIMARY KEY DEFAULT TRUE
, data text
, CONSTRAINT onerow_uni CHECK (onerow_id)
);
对于CHECK
列,boolean
约束可以很简单。只允许TRUE
。
答案 1 :(得分:9)
向表中添加新列,然后在此列上添加检查约束和唯一性约束。例如:
CREATE TABLE logging (
LogId integer UNIQUE default(1),
MyData text,
OtherStuff numeric,
Constraint CHK_Logging_singlerow CHECK (LogId = 1)
);
现在你只能拥有一行LogId = 1.如果你试图添加一个新行,它将破坏唯一性或检查约束。
(我可能搞砸了语法,但是它给你一个想法?)
答案 2 :(得分:1)
您应该在此表上创建ON BEFORE INSERT
触发器。在触发器上,调用检查count(*)
的过程,当计数为1时,它会向用户返回一条异常消息,否则允许插入继续。
检查this documentation以获取示例。