gpt4 book ai didi

sql - 如何向sql表添加约束,使表只有一行

转载 作者:行者123 更新时间:2023-11-29 11:54:19 24 4
gpt4 key购买 nike

最初创建参数表并在 Postgres 中添加一行。

此表应始终只有一行,否则使用此表的 SQL 查询将产生不正确的结果。不允许对该表进行DELETEINSERT,只允许UPDATE

如何给这个表添加单行约束?
也许 DELETEINSERT 触发器可以引发异常或者是否有更简单的方法?

最佳答案

下面将创建一个表格,您只能在其中插入一行。 id 列的任何更新都将导致错误,任何具有不同于 42 的值的插入也会导致错误。实际的 id 值实际上并不重要(除非有您需要的一些特殊含义)。

create table singleton
(
id integer not null primary key default 42,
parameter_1 text,
parameter_2 text,
constraint only_one_row check (id = 42)
);

insert into singleton values (default);

要防止删除,您可以使用规则:

create or replace rule ignore_delete
AS on delete to singleton
do instead nothing;

如果您想让 insert 静静地“失败”,您也可以使用规则让 insert 什么也不做。如果没有规则,insert 会产生错误。如果您希望 delete 也产生错误,则需要创建一个触发器来简单地引发异常。


编辑

如果你想为插入或删除抛出错误,你需要一个触发器:

create table singleton
(
id integer not null primary key,
parameter_1 text,
parameter_2 text
);

insert into singleton (id) values (42);

create or replace function raise_error()
returns trigger
as
$body$
begin
RAISE EXCEPTION 'No changes allowed';
end;
$body$
language plpgsql;


create trigger singleton_trg
before insert or delete on singleton
for each statement execute procedure raise_error();

请注意,您必须在创建触发器之前插入单行,否则无法插入该行。

这仅部分适用于 super 用户或表的所有者。两者都有权删除或禁用触发器。但这就是 super 用户的本性 - 他无所不能。

关于sql - 如何向sql表添加约束,使表只有一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29428747/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com