【问题标题】: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 值的行怎么办?

标签: sql postgresql exclusion-constraint


【解决方案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

【讨论】:

    猜你喜欢
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    相关资源
    最近更新 更多