sql - 限制插入具有默认值的列
问题描述
以以下架构为例:
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;
...
这样做的缺点是:
- 该架构没有明确说明 UID 实际上是随机分配的。
- 用户可以指定一个零 UID,然后它会被静默替换。
解决方案
推荐阅读
- python - 通过色调孵化 seaborn 计数图
- python - RPYC 多客户端断开连接问题
- java - java - 如何从Java Springboot中的URL参数填充字段
- javascript - 如何通过 Content View 运行从 iPhone 上的 npm-library 导入的 JS 脚本?
- node.js - Strapi 按多对多关系过滤
- java - 如何使用 maven 为 Micronaut 创建可执行 jar 文件?
- reactjs - React Formik:IsSubmitting 不适合我
- roslyn - 在 Roslyn 分析器/源生成器中,有什么方法可以区分直接和传递程序集引用
- amazon-s3 - 如何使用骆驼将文件从一个 s3 存储桶移动到另一个(多个)存储桶?
- c# - 以从右到左的布局打印文档