PostgreSQL - 根据另一个单元格值设置默认单元格值

2024-05-16

如果我有一个专栏说column a任何给定值,我想要另一列column b有一个default value根据 的值column a

换句话说:
if column a = 'peter' then column b default value = 'doctor'.


This is 不可能用一个简单的DEFAULT值,如手册明确指出 https://www.postgresql.org/docs/current/sql-createtable.html:

该值是任何无变量表达式(子查询和 不允许交叉引用当前表中的其他列)。

你可以使用trigger https://www.postgresql.org/docs/current/sql-createtrigger.html反而:

CREATE OR REPLACE FUNCTION trg_foo_b_default()
  RETURNS trigger
  LANGUAGE plpgsql AS
$func$
BEGIN
   -- For just a few constant options, CASE does the job:
   NEW.b := CASE NEW.a
               WHEN 'peter'  THEN 'doctor'
               WHEN 'weirdo' THEN 'shrink'
               WHEN 'django' THEN 'undertaker'
            -- ELSE null default
            END;

   /*
   -- For more, or dynamic options, consider a lookup table:
   SELECT INTO NEW.b  t.b
   FROM   def_tbl t
   WHERE  t.a = NEW.a;
   */

   RETURN NEW;
END
$func$;


CREATE TRIGGER b_default
BEFORE INSERT ON foo
FOR EACH ROW
WHEN (NEW.b IS NULL AND NEW.a IS NOT NULL)
EXECUTE FUNCTION trg_foo_b_default();

对于 Postgres 10 或更早版本,请使用EXECUTE PROCEDURE ...反而。看:

  • 触发功能不存在,但我很确定它存在 https://dba.stackexchange.com/a/255319/3684

为了使其更有效,请使用WHEN触发器定义中的子句(自 Postgres 9.0 起可用)。这样,触发器函数仅在实际有用时才执行。 (假设我们可以让b IS NULL滑动如果a IS NULL.)

在 Postgres 12 或更高版本中,GENERATED列可能是更好的解决方案。看jian的补充答案 https://stackoverflow.com/a/69569932/939860。但请注意,这些限制手册 https://www.postgresql.org/docs/current/sql-createtable.html:

生成表达式可以引用表中的其他列,但是 不是其他生成的列。使用的任何函数和运算符都必须是 不可变的。不允许引用其他表。

这个触发器是与a略有不同DEFAULT value在那个空值中b总是被替换为派生的值a,同时一个DEFAULT只是默认值,可以通过任何显式输入来推翻。
A GENERATED列不允许开始输入。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostgreSQL - 根据另一个单元格值设置默认单元格值 的相关文章

  • 我截断了一个表。我如何取回数据?

    在我的 postgresql 数据库中 不幸的是我截断了表mail group 并且该表已从数据库中删除 如何找回该表 请帮助我 等待回复 Thanks 其他有同样情况的人 立即地停止你的数据库pg ctl stop m immediate
  • PostgreSQL 自定义异常条件

    当我提出异常时是否可以创建自定义条件 考虑以下示例 BEGIN y x 0 EXCEPTION WHEN division by zero THEN RAISE NOTICE caught division by zero RETURN x
  • PostgreSQL:用以前的值填充时间序列查询中的 NULL 值

    我有一个包含时间相关信息的数据库 我想要一个包含每分钟值的列表 像这样 12 00 00 3 12 01 00 4 12 02 00 5 12 03 00 5 12 04 00 5 12 05 00 3 但是 当几分钟内没有数据时 我得到如
  • 如何将子表的删除级联到父表?

    我准备了a fiddle这说明了问题 http sqlfiddle com 15 e25c5 2 CREATE TABLE parent parent id integer primary key CREATE TABLE child ch
  • 在 Postgres 中为特定查询设置 work_mem

    我正在使用一个委托给 JDBC 驱动程序的库PostgreSQL 而且有些查询非常复杂 需要更多内存 我不想设置work mem对于所有查询来说都是大的 只是这个子集 问题是执行以下代码会导致错误 pseudo code for what
  • Join 表(关联表)有主键吗?多对多关系

    Join 表 关联表 有主键吗 多对多的关系 我见过一些带有主键的连接表 一些没有 有人可以解释一下连接表中何时会有主键吗 为什么 先感谢您 在纯 联接 或联结表中 所有字段都将成为主键的一部分 例如 让我们考虑下表 CREATE TABL
  • 如何使用SQLAlchemy无缝访问多个数据库?

    假设我为公司的不同部门创建了一个产品数据库系统 由于各种原因 每个部门都有自己的 PostgreSQL 数据库实例 数据库的模式是相同的 但其中的数据不同 对于每个系统 都有一个 Python 应用程序来执行一些业务逻辑 无关 每个 Pyt
  • 带触发器的物化视图?

    我可以在物化视图上创建触发器吗 我用的是甲骨文10g 是的你可以 请小心 这是什么Oracle 文档 http download oracle com docs cd B19306 01 server 102 b14200 statemen
  • 如何禁用 PostgreSQL 的所有优化

    我正在研究查询优化 想知道每种优化对查询有多大帮助 上次 我得到了一个answer https stackoverflow com questions 22785064 how to disable enable different que
  • 无法确定“Npgsql.NpgsqlFactory”类型的提供程序工厂的提供程序名称

    我尝试运行一个测试项目 但没有成功 因为 npgsql 连接失败 我重新安装了 Npgsql Npgsql EntityFramework EntityFramwork 但问题仍然存在 结果消息 TestUserControl Contro
  • SQL Server:我可以使用 EXEC 来运行外部应用程序吗?

    您好 感谢您抽出时间 我一直在网上到处搜索一个示例 其中 SQL 触发器将运行外部应用程序 但我没有运气 我所看到的是 EXEC 将执行 SQL 过程 我需要这个的原因是 我有一个包含许多表的 SQL Server 2010 当某些表上发生
  • 实体框架中 1:1 关系中关联的主体端意味着什么

    public class Foo public string FooId get set public Boo Boo get set public class Boo public string BooId get set public
  • WPF XAML 网格可见性触发器

    我的网格第一行有一条状态消息 我希望它在可见性发生变化时滑入和滑出 第一个可见性触发器效果很好 可以快速打开第一个网格行 一旦我添加 折叠 触发器 就什么都不起作用了 当可见性设置为折叠时 如何反转动画以滑动关闭
  • SQL Server 中数据库数量的实际限制?

    在 stackoverflow 播客之一 我认为是 18 中 Jeff 和 Joel 正在讨论多租户数据库与单租户数据库 Joel 提到 FogBugz on Demand 使用了每个客户架构的数据库 我想知道是否有一个点超过这个点 您将需
  • 无法恢复 pg_dump 备份

    我正在尝试从 Postgres 9 1 1 恢复备份 该备份的创建者是 pg dump mydb gt backup sql 在 Postgres 9 1 9 上恢复 psql d mydb f backup sql 我收到此错误 psql
  • Oracle 触发器创建时出现编译错误,ORA-02289: 序列不存在

    当我使用 PowerDesigner 生成 SQL 并在 Oracle 中运行它时 它会抛出错误 警告 触发器创建时出现编译错误 create trigger tib material classify before insert on m
  • PostgreSQL 错误:EXECUTE 的查询字符串参数为空

    我有一个名为证据的表 其中有一个触发器调用一个存储过程 该过程基本上按月进行表分区 但是 当我开始在负载下插入大 量行时 出现了一个模糊的错误 Npgsql NpgsqlException query string argument of
  • 如何在 Postgres 中将表从公共模式移动到其他模式

    Postgres 9 1 数据库包含公共模式中的表 yksus1 ykssu9 pgAdmin 显示了这些定义 如下面的代码所示 如何将这些表移至 Firma1 架构 Firma1 模式中的其他表具有对这些表主键的外键引用 对这些表的外键引
  • 如何在 PostgreSQL 函数中声明行类型数组?

    我正在尝试创建一个 PostgreSQL 函数 在用它做更多事情之前 我将循环查询的行并将其中一些存储在数组中 如何创建行类型数组 CREATE OR REPLACE FUNCTION forExample RETURNS integer
  • 如何使用diesel-rs选择色谱柱的子集?

    我现在花了几个小时的时间来查询表的可用列的子集以及在其中包含计算 我知道这不是在选择查询中执行计算的最佳方式 但现在 我只是在开发一个原型 它应该是可行的 我在用diesel rs作为后端实现中所有数据库操作的 ORM 数据将存储在 Pos

随机推荐

  • 由于未定义符号,PECL solr 未加载:curl_easy_getinfo

    我正在尝试加载 PECL solr 扩展 我尝试使用 pecl install solr 并下载并使用 phpize configure make 来安装它 在这两种情况下 扩展安装时都没有错误 但在 apache 重新启动后 或在命令行上
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • 生产中的日志级别

    我需要在产品上设置日志级别 并且我确实知道有不同的日志级别 任何人都可以建议或推荐在生产环境中设置的正确日志级别是什么 如果我将日志级别设置为finest它为我提供了所有日志 这对于开发人员调试非常有用 但是我们如何管理它们 因为会生成大量
  • 如何从连接到外部网络的另一个组合访问容器?

    这是带有容器配置的撰写文件 我希望从外部容器连接到该容器 在另一个撰写文件中定义 version 3 5 services service to connect to build networks my external network n
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • JUNIT 测试 void 方法

    我有一个充满 void 方法的 java 类 我想进行一些单元测试以获得最大的代码覆盖率 例如我有这个方法 protected static void checkifValidElements int arg1 int arg2 metho
  • Aurelia 中的角度服务?

    我还没有找到详细说明如何从 Angular 1 x 迁移到 Aurelia 的详细文档 到目前为止 我只看到人们详细介绍了 Angular 的概念directive可以在 Aurelia 中使用重制 customElement 好吧 足够简
  • Clojure 宏expand

    Why does macroexpand arm getHand getFinger 扩展到 arm getHand getFinger while macroexpand gt arm getHand getFinger 扩展到 getF
  • PHPunit - 错误

    当 PHPunit 框架不希望发生的错误发生时 测试会停止 PHP 会抛出错误 但 PHPunit 不会记录这是一个错误 我如何确保 PHPunit 将其记录为错误 免责声明 我是 PHPUnit 的新手 我也试图弄清楚 发生错误时会发生什
  • App Engine 实体到字典

    将 google app engine 实体 在 python 中 复制到字典对象的好方法是什么 我正在使用 db Expando 对象 所有属性均为扩展属性 Thanks 有一个名为foo尝试 foo dict
  • Safari 滚动条和 SVG

    问题 Safari 无法正常工作 而是使用滚动条渲染我的 SVG 图像 问题的改进版本 如何填充设定的宽度并根据 Safari 中的宽高比计算高度 感谢普罗格兹 相关代码 SVG File viewBox 0 0 800 800 未指定高度
  • 提升mapped_file_source、对齐方式和页面大小

    我正在尝试在性能很重要的上下文中解析一些大小高达几百兆字节的文本文件 因此我使用 boostmapped file source 解析器期望源以空字节终止 因此我想检查文件大小是否是页面大小的精确倍数 如果是 则使用较慢的非内存映射方法 我
  • 使用 PHP 创建图表并导出为 PDF

    我正在寻找有关使用 PHP 创建图表的建议 我还希望能够将这些图表导出到 PDF 文档 我目前正在使用谷歌图表 但我不喜欢将我的所有信息发送到谷歌的想法 我更喜欢自己的托管解决方案 我见过很多 Flash 解决方案 但我不知道有什么方法可以
  • 为什么 RackMultipart* 文件保留在我的 Rails /tmp 目录中?

    我正在使用 Paperclip 2 3 来处理在 Ubuntu 上运行的 Rails 3 0 3 应用程序上的图像上传 Paperclip 正在按广告处理上传 但在应用程序的 tmp 文件夹中创建的 RackMultipart 文件仍然存在
  • 嵌套 DIV 的类似斑马的 CSS 样式

    我嵌套了 DIV 元素 但我不知道嵌套的级别 我需要每个都有与其父级不同的背景 创建类似斑马的颜色 我只使用两种背景 深色和白色 效果需要类似于在容器中设置奇数和偶数子级的样式 但在我的例子中 子级是嵌套的 我可以使用每个嵌套元素的规则来做
  • 名称查找、实例化点 (POI) 和基本类型

    以下代码针对 X 进行编译 但不适用于 double struct X void foo double void foo X namespace NN struct A void foo A foo double error foo not
  • 在 Java 中创建 XML 文件的最佳方法是什么?

    我们目前使用 dom4j 来创建 XML 文件 不过 我猜现在有更好的东西了 如果我们使用的是 Java 1 6 或更高版本 那么在编写 XML 文件时最好使用什么类 运行速度最快 使用简单 我不需要构建一个 DOM 然后编写整个 DOM
  • 如何在 Gnuplot 中将线条样式设置为多个绘图的默认样式?

    我想使用 gnuplot 创建绘图 所有图中的线宽均应为 3 如果我只对一个地块执行此操作 则可以通过以下方式完成 set style line 1 linewidth 3 有什么办法可以默认全局执行此操作吗 您可以指定 set termi
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • PostgreSQL - 根据另一个单元格值设置默认单元格值

    如果我有一个专栏说column a任何给定值 我想要另一列column b有一个default value根据 的值column a 换句话说 if column a peter then column b default value do