And*_*rus 2 sql postgresql database-design
最初创建参数表,并在Postgres中添加一行。
该表应该总是有一行,否则使用该表的SQL查询将产生错误的结果。DELETE或INSERT不允许进入此表,仅UPDATE允许。
如何向该表添加单行约束?
也许DELETE和INSERT触发器可以引发异常或有更简单的方法?
下面将创建一个表,您只能在其中插入一行。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)
请注意,在创建触发器之前,您必须插入单行,否则无法插入该行。
这对于超级用户或表所有者仅部分起作用。两者都有删除或禁用触发器的特权。但这就是超级用户的本性-他可以做任何事情。
| 归档时间: |
|
| 查看次数: |
602 次 |
| 最近记录: |