首页 > 解决方案 > 限制插入具有默认值的列

问题描述

以以下架构为例:

CREATE TABLE public."RiskHeaders"
(
    "UID" uuid NOT NULL DEFAULT uuid_generate_v4(),
    "Name" character varying(35) NOT NULL
)

是否可以阻止INSERT包含列值的语句UID

为免生疑问,我希望UID列中的所有值都是通过默认值函数随机生成的。

我曾希望我可以使用 INSERT 触发器来查看是否UID已填充,但这似乎是不可能的:

BEGIN
    IF TG_OP = 'INSERT' THEN
        IF TG_WHEN = 'BEFORE' THEN
            RAISE NOTICE 'Before: Old = %    New = %', OLD."UID", NEW."UID";
        ELSIF TG_WHEN = 'AFTER' THEN
            RAISE NOTICE 'After: Old = %    New = %', OLD."UID", NEW."UID";
        END IF;
    END IF;
    RETURN NEW;
END;

运行INSERT INTO "RiskHeaders"("Name") VALUES ('Test');给出以下控制台输出:

NOTICE:  Before: Old = <NULL>    New = ccc6757f-d1a2-4849-828d-017d2b738c9d
NOTICE:  After: Old = <NULL>    New = ccc6757f-d1a2-4849-828d-017d2b738c9d

运行INSERT INTO "RiskHeaders"("UID", "Name") VALUES (uuid_generate_v4(), 'Test1');给出相同的输出(尽管具有不同的 UUID)。

提前感谢您的任何建议,希望这不是一个太愚蠢的问题!


非常感谢所有的建议!

鉴于我(鲁莽?)决心将UID列保留为一种uuid类型并阻止用户在 上指定任何值INSERT,我想出了以下解决方法(/bodge):

我现在使用以下架构:

CREATE TABLE public."RiskHeaders"
(
    "UID" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'::uuid,
    "Name" character varying(35) NOT NULL
}

接受@stickybit 的建议使用触发器......我想出了一个触发器,效果如下:

    IF TG_OP = 'INSERT' THEN
        IF TG_WHEN = 'BEFORE' THEN
            IF NEW."UID" <> '00000000-0000-0000-0000-000000000000'::uuid THEN
                RAISE EXCEPTION 'A UID cannot be specified when creating a risk.';
            ELSE
                NEW."UID" := uuid_generate_v4();
                RETURN NEW;             
            END IF;
            ...
        END IF;
    END IF;
    ...

这样做的缺点是:

标签: sqlpostgresql

解决方案


推荐阅读