Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 一条语句中的“如果表存在则更新”-如何更新?_Sql_Postgresql_Postgresql 9.2 - Fatal编程技术网

Sql 一条语句中的“如果表存在则更新”-如何更新?

Sql 一条语句中的“如果表存在则更新”-如何更新?,sql,postgresql,postgresql-9.2,Sql,Postgresql,Postgresql 9.2,我对作为长事务的一部分的SQL语句有一个问题 更新选项卡1 左连接选项卡2 在tab_1.id=tab_2.tab_1_id 设置tab_1.something=42 其中tab1.id=tab_2.tab_1_id 很明显,只要数据库中存在tab_1和tab_2,一切都很简单,并且工作正常- 问题是事务必须在4个不同的服务器上提交,而tab_2是动态表,它可能存在于特定的db/db模式中,也可能不存在于 如果tab_2不存在,数据库将抛出异常,并且不会提交整个事务。我想要的是继续只更新0行 我

我对作为长事务的一部分的SQL语句有一个问题

更新选项卡1 左连接选项卡2 在tab_1.id=tab_2.tab_1_id 设置tab_1.something=42 其中tab1.id=tab_2.tab_1_id

很明显,只要数据库中存在tab_1和tab_2,一切都很简单,并且工作正常-

问题是事务必须在4个不同的服务器上提交,而tab_2是动态表,它可能存在于特定的db/db模式中,也可能不存在于

如果tab_2不存在,数据库将抛出异常,并且不会提交整个事务。我想要的是继续只更新0行

我试过这样的方法:

更新[如上所述]其中tab1.id=tab_2.tab_1_id且存在从pg_类中选择1,其中relname='tab_2'

…但这仍然是错误的,因为异常检查是在where条件之前进行的,它与我们要在join中使用的表相同

使用纯SQL有什么方法可以做到这一点吗

类似于:如果tab_2存在,则左连接tab_2;如果不存在,则不执行任何操作,返回null,等等

我知道在pl/pgsql过程中有一种方法可以做到这一点。 第二种可能是在语句之前创建表(如果不存在)

但也许有一种简单而优雅的方式可以做到这一点:

DBMS:postgresql9.2

我认为,即使不存在表,更新语句也不会成功,这既简单又优雅。我认为这是奇怪的和令人困惑的

为什么不包括一个检查该表是否存在的条件,并且只在该表存在时执行更新?这会更清楚

另一个选项是创建一个视图,如果存在选项卡2,则指向该选项卡2;否则,则指向空表。如果您有很多这样的查询,并且不想全部更改,那么这可能会很有帮助

更新:以下是函数或开始…结束块中的条件的外观:


根据Postgresql的详细信息,如果在UPDATE语句I不是Postgresql用户中看到一个不存在的表,则编译仍然可能失败。在这种情况下,您需要创建一个指向tab_2(如果它存在)的视图,如果它不存在,则需要创建一个空表。

您是对的,仅在特定条件下检查并进行更新是更好的解决方案,我真的非常想这样做。…:但是怎样也许这是个愚蠢的问题。。现在,我尝试在存在时使用UPDATE CASE,但没有结果。。我想用这么复杂的条件是不可能的。。我错了吗?
IF EXISTS (select 1 from pg_class where relname='tab_2') THEN 
   UPDATE...
END IF;