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') )
我想根据源 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') )