如何只允许一行表?

X-j*_*-jo 12 sql postgresql database-design postgresql-9.1

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

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

Erw*_*ter 23

一个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)
);
Run Code Online (Sandbox Code Playgroud)

CHECK约束可以是一个简单boolean列.只TRUE允许.


Ric*_*ell 10

向表中添加新列,然后在此列上添加检查约束和唯一性约束.例如:

CREATE TABLE logging (
    LogId integer UNIQUE default(1),
    MyData text,
    OtherStuff numeric,
    Constraint CHK_Logging_singlerow CHECK (LogId = 1)
);
Run Code Online (Sandbox Code Playgroud)

现在,您只能拥有一行LogId = 1.如果您尝试添加新行,它将破坏唯一性或检查约束.

(我可能搞砸了语法,但是它给你一个想法?)

  • 有两种数据库管理员:"迂腐"的管理员和那些在SO上发布关于神秘"破碎"数据库的绝望问题.:p (3认同)

Cod*_*bie 7

您应该在此表上创建一个ON BEFORE INSERT触发器。在触发器上,调用一个过程进行检查count(*) ,当计数为 1 时,它会向用户返回一条异常消息,否则允许继续插入。

查看此文档以获取示例。

  • 毫无疑问,你的方法是有效的,而且是的,这更昂贵。我只是提供一个无需更改表格即可工作的解决方案。 (3认同)
  • 当这不是您要插入的表时(不止一次;大概这样的表的目的是存储类似单例的配置),为什么这个问题的昂贵性会很重要?从美学上来说,这对我来说肯定更令人愉快,因为您不需要与存储的数据无关的列和检查。 (3认同)

小智 5

我想这里不需要额外的字段。只是常量的唯一索引:

CREATE UNIQUE INDEX ux_onerow ON onerow ((0));
Run Code Online (Sandbox Code Playgroud)