当前位置: 首页 > 面试题库 >

我有一个删除插入CTE,它以一种奇怪的方式失败了

郑安晏
2023-03-14
问题内容

这是成功的一个例子:

with x as ( 
    delete from common.companies where id = '0f8ed160-370a-47bb-b4bf-2dcf79100a52' 
    returning row_to_json(companies) as old_data, null as new_data, 'common.companies' as model, id, 'delete' as action)
insert into edit_history (old_data, new_data, model, model_pk, action, submitter)
select old_data, null, model, id, action, '0b392013-f680-45a6-b19a-34f3d42d0120' from x;

INSERT 0 1

请注意,insert-select中的第二列是明确为null。

这是一个失败的示例:

with x as (
    delete from common.companies where id = '160d7ef2-807c-4fe0-bfed-7d282c031610' 
    returning row_to_json(companies) as old_data, null as new_data, 'common.companies' as model, id, 'delete' as action)
insert into edit_history (old_data, new_data, model, model_pk, action, submitter)                                                                   
select old_data, new_data, model, id, action, '0b392013-f680-45a6-b19a-34f3d42d0120' from x;

ERROR:  failed to find conversion function from unknown to json

请注意,在此示例中,我得到了new_data,而不是第二列中的显式null ,它从delete语句作为null返回

如果两个值都为null,那么第二个示例为什么会因为这个错误而困扰我?我已经仔细检查了两者,这是唯一的功能差异。


问题答案:

在第一个示例中,您为语句提供了一个 尚未输入类型的 NULL INSERT

在第二个示例中,您较早一步(在CTE中)提供NULL,则必须键入表达式并为其指定type unknown。对于其他
常量

(例如数字常量123:),Postgres可以派生更合适的默认数据类型,但NULL(或字符串文字'foo')可以是 任何东西
。并且在unknown和之间没有定义类型转换json

在CTE中将NULL强制转换为正确的数据类型可以避免该问题(如您现在所知)。
或者text为时已晚,在铸造链中用作垫脚石。一切都可以投射到/投射出来text

您可以将演示简化为以下内容:

作品:

SELECT NULL::json;

失败:

SELECT new_data::json
FROM  (SELECT NULL AS new_data) t;

再次工作:

SELECT new_data
FROM  (SELECT NULL::json AS new_data) t;

或者:

SELECT new_data::text::json
FROM  (SELECT NULL AS new_data) t;


 类似资料:
  • 问题内容: @Entity public class Person { 给定以下类结构,当我尝试将新位置添加到“人的位置”列表中时,它总是导致以下SQL查询: 和 Hibernate(3.5.x / JPA 2)删除给定Person的所有关联记录,然后重新插入所有以前的记录以及新的记录。 我有一个想法,即Location上的equals / hashcode方法可以解决此问题,但是它没有任何改变。

  • 问题内容: 我使用免费的虚拟主机000webhost。该服务还可以,但是它会在每个文件和请求中插入一些javascript计数器。该脚本如下所示。 如果我做一个jQuery发布,它破坏了我的代码,我没有任何回应。 我该如何解决?如何删除托管JavaScript代码? 问题答案: 他们在其cPanel中有一个链接,您可以在其中禁用分析代码。 http://members.000webhost.com

  • 问题内容: 输入以下代码: 对我来说,这段代码可以编译并不奇怪,但是ClassCastException发生在get行而不是它上面的put行,尽管我确实对可能发生的事情有一个有根据的猜测。由于在运行时会擦除泛型类型,因此getValue()中的强制转换实际上从不会在运行时发生,并且实际上是对Object的强制转换。如果按以下方式实现该方法,则将发生运行时强制转换,并且将在放置行上失败(如预期的那样

  • 是否有可能为二叉查找树制作一个插入方法,比如空格插入(int值),通常你必须有像插入(节点节点,int键)这样的东西。我想用整数数组填充一棵树,同时仍然保持普通插入方法的低插入运行时间为一棵树O(logn)

  • 本文向大家介绍对python 各种删除文件失败的处理方式分享,包括了对python 各种删除文件失败的处理方式分享的使用技巧和注意事项,需要的朋友参考一下 调用python提供的各种删除文件的操作均失败 返回值5,拒绝访问,但是多次确认文件没有被打开,文件是从一个zip包中解压出来后,没有任何打开读写等操作 最后调用windows的强制删除命令才搞定 以上这篇对python 各种删除文件失败的处理

  • 我添加了一个foreignKey列来指定用户的角色。这是users表:在我将nullable()添加到role_id列之前,他们被告知role_id列没有默认值,当我添加nullable()时,他们将NULL值插入表中 这是角色表: 这是角色列的刀片代码:我在刀片代码中添加了一个数组,以在选项标记中显示其内容,属性名称为“role_id” 这是“CreateNewUser.php”文件的创建方法: