BigQuery:如何使 MERGE 操作在某些情况下失败?

BigQuery : how to make a MERGE operation fail on some conditions?

我想根据源 table (source) 中的行更新目标 table (target)。为此,我使用 MERGE statement。但是,我希望整个 MERGE 操作在某些情况下失败,但不知道该怎么做。

例子

target table 包含:

id
==
1
2

source table 包含:

id | operation
==============
3  | ADD
4  | DELETE

预期 target table 在 MERGE 之后(我不想 any 在这里更新,因为 4 对应于 DELETE 操作,并且由于 target table 中没有 4 行,这被认为是一个错误并且 MERGE 应该自动失败):

id
==
1
2

截至目前,我使用以下请求:

MERGE `target` target
USING `source` source
ON target.id = source.id
WHEN not matched AND source.operation = "ADD" THEN
  INSERT (id)
  VALUES (source.id)

但显然,我得到了:

id
==
1
2
3

是否可以在我的查询中添加一个子句,如:

WHEN not matched AND source.operation = "DELETE" THEN ERROR("...")

这不起作用(ERROR 出乎意料):

Syntax error: Expected keyword DELETE or keyword INSERT or keyword UPDATE but got identifier "ERROR"

如果 MERGE 查询无法做到这一点,是否有办法将其重写为类似的查询,以原子方式更新我的 target table,如我所料?

您可能会自己产生错误。类似于:

WHEN not matched AND source.operation = 'DELETE' THEN 
    INSERT (id)
       VALUES ( CAST(source.operation as int64) )

我没有故意尝试在 BigQuery 中生成错误,但我认为没有自动执行此操作的函数。

如@norbjd 所提议:

WHEN not matched AND source.operation = 'DELETE' THEN 
    INSERT (id)
       VALUES ( ERROR('ERROR:  DELETE operation encountered') )