如何施加这种排除约束?
Posted
技术标签:
【中文标题】如何施加这种排除约束?【英文标题】:How to impose this exclusion constraint? 【发布时间】:2021-02-18 18:21:59 【问题描述】:我有一个键值表。
CREATE TABLE keyvalues (
key TEXT NOT NULL,
value TEXT
)
我想施加一个约束,如果一个键有一个 NULL 值的条目,它不能有任何其他条目。 我该怎么做?
澄清: 我想允许(“key1”,“value1”),(“key1”,“value2”)。但是如果我有 ("key2", NULL),我想不允许 ("key2", "value3")。
【问题讨论】:
嗯?键是NOT NULL
它不能有 NULL
值。您将展示一些(伪)代码来解释您想要实现的目标。
我的意思是一个看起来像(“key”,NULL)的条目。即,值字段为 NULL。我想允许(“key1”,“value1”),(“key1”,“value2”)。但是如果我有 ("key2", NULL),我不想允许 ("key2", "value3")。
由于PostgreSQL支持triggers,你可以探索BEFORE INSERT
。
如果您有一个键的值并尝试插入具有相同键和 NULL 值的行怎么办?
【参考方案1】:
您可以使用触发器,如下所示:
CREATE OR REPLACE FUNCTION trigger_function()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
begin
if exists (select 1 from keyvalues key = new.key and value is null) then
RAISE EXCEPTION 'Key-value not allowed';
end if;
RETURN new;
end;
$function$
;
然后你在表上创建触发器
CREATE TRIGGER trigger_on_table
BEFORE INSERT OR UPDATE
ON keyvalues
FOR EACH ROW
EXECUTE PROCEDURE trigger_function();
并对其进行测试:
insert INTO keyvalues
SELECT 'a','a'
好的
insert INTO keyvalues
SELECT 'a','b'
好的
insert INTO keyvalues
SELECT 'b',null
好的
insert INTO keyvalues
SELECT 'b','b'
ERROR: Key-value not allowed
【讨论】:
以上是关于如何施加这种排除约束?的主要内容,如果未能解决你的问题,请参考以下文章