如何只允许一行表?

时间:2014-08-14 11:43:01

标签: sql postgresql database-design postgresql-9.1

我有一张桌子,我希望只有一个条目。因此,如果有人试图插入另一行,则只有在有人删除了以前存在的行之后才允许这样做。

如何为这样的表设置规则?

3 个答案:

答案 0 :(得分:20)

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

类似的注意事项适用于CHECK约束。它们允许表达式为TRUENULL(不是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以获取示例。