如何只允许表格有一行?

188 浏览
0 Comments

如何只允许表格有一行?

我有一张表格,我只想要一条记录。因此,如果有人试图插入另一行,不应该被允许,只有在有人删除之前存在的行之后才允许插入。我该如何设置这样的表格规则?

0
0 Comments

如何只允许表中有一行?

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

这种方法是可能的,但比必要的更昂贵和复杂。你的方法确实有效,没有疑问,而且是更昂贵的。我只是提供了一种不需要修改表格的解决方案。

为什么昂贵性会成为问题,当这不是一个你会插入的表格(除了一次之外)(可以假设这种表格的目的是存储类似配置的单例)?从美学上讲,对我来说这更令人愉悦,因为你不需要与存储的数据无关的列和检查。

0
0 Comments

如何只允许表中有一行数据?

有时候我们希望在数据库表中只允许存在一行数据,这种限制可以通过添加新的列和约束来实现。下面是一个示例:

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

在这个例子中,我们给表添加了一个名为LogId的新列,并在该列上添加了唯一性约束和检查约束。这样,我们就只能在LogId等于1时插入一行数据。如果尝试插入新行时违反了唯一性约束或检查约束,系统会报错。

需要注意的是,唯一性约束允许存在多个NULL值,所以这种方法并不安全。在某些数据库中,如SQL Server,唯一性约束只允许存在一个NULL值,这可能是更为合理的实现方式。然而,在上述示例中,我们的目的是在创建新行时不指定LogId的值,这样它将使用默认值1,而不是NULL,因此NULL值的问题并不重要。

总结一下,我们可以通过添加新列和约束来实现只允许表中存在一行数据的限制。这种方法在数据库管理中被称为"pedantic",但它可以避免一些在使用数据库时可能遇到的问题。希望这篇文章对你有所帮助!

0
0 Comments

如何只允许表中存在一行?

当使用UNIQUE约束时,允许多行具有null值,因为两个null值被认为是不同的。(除非在Postgres 15或更高版本中使用NULLS NOT DISTINCT)。

类似的考虑也适用于CHECK约束。它们允许表达式为true或null(但不能为false)。同样,null值会通过检查。

为了排除这种情况,可以将列定义为NOT NULL,或者将其设为主键,因为主键列自动定义为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(以及其他角色)中撤销(或不授予)DELETE和TRUNCATE权限,以防止单行被删除。例如:

REVOKE DELETE, TRUNCATE ON public.onerow FROM public;

以上就是如何只允许表中存在一行的解决方法。

0