我有一个对 tuple 具有唯一约束的映射表(c_id, t_id)
。
以下是一些示例数据来说明情况:
id c_id t_id
----------------
1 10 2
2 10 3
3 10 7
4 12 2
5 13 3
t_ids
我为(x,y -> z OR x,y -> x)编写了一个合并函数。如果我的内容 ( c_id
) 两者都有t_ids
,那么我当然违反了使用以下语句的约束:
UPDATE mapping_table
SET t_id = '$target_tid'
WHERE t_id = '$t1_id' OR t_id = '$t2_id';
结果将是:
id c_id t_id
----------------
1 10 4
2 10 4 /* violates unique constraint */
3 10 7
现在我想出了这个:
/* delete one of the duplicate entries */
DELETE FROM mapping_table
WHERE ( SELECT count(c_id)
FROM mapping_table
WHERE t_id = '$t1_id' OR t_id = '$t2_id'
) > 1;
/* update the remaining row */
UPDATE mapping_table
SET t_id = '$target_tid'
WHERE t_id = '$t1_id' OR t_id = '$t2_id';
现在我收到以下错误:
You can't specify target table 'mapping_table' for update in FROM clause
我的问题是:
- 这里到底出了什么问题?该
DELETE
语句是否被视为更新并且不能在WHERE
子句中使用? - 这有没有更有效的方法来做到这一点?