如何将约束添加到sql表,以使表恰好有一行

And*_*rus 2 sql postgresql database-design

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

该表应该总是有一行,否则使用该表的SQL查询将产生错误的结果。DELETEINSERT不允许进入此表,仅UPDATE允许。

如何向该表添加单行约束?
也许DELETEINSERT触发器可以引发异常或有更简单的方法?

a_h*_*ame 6

下面将创建一个表,您只能在其中插入一行。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);
Run Code Online (Sandbox Code Playgroud)

为了防止删除,您可以使用以下规则:

create or replace rule ignore_delete
  AS on delete to singleton
     do instead nothing;
Run Code Online (Sandbox Code Playgroud)

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

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

这对于超级用户或表所有者仅部分起作用。两者都有删除或禁用触发器的特权。但这就是超级用户的本性-他可以做任何事情。