【发布时间】:2017-08-10 11:32:14
【问题描述】:
我想根据event表数据UPDATE维度表client中的某列:
UPDATE client AS c
SET
some_attr_last_value = last_attr_values.value
FROM (
SELECT
l.client_id,
value,
ROW_NUMBER() OVER (PARTITION BY l.client_id ORDER BY timestamp DESC) AS num
FROM event AS l
WHERE
timestamp > DATE_TRUNC('month', NOW() - INTERVAL '1 month')
) AS last_attr_values
WHERE
last_attr_values.num = 1 AND
c.client_id = last_attr_values.client_id AND
c.some_attr_last_value <> last_attr_values.value;
我已经有一些类似上面的查询:它们以相同的方式更新其他列(仅与其他列一起)并且运行良好。但是一个查询会产生错误:
错误 6745:重复键值:'client_id=...' -- 违反约束 '....client.C_PRIMARY'
但我不会尝试更改client_id。为什么会出现这个错误?
我检查了client 表,但它没有重复。 ANALYZE_CONSTRAINTS('client') 也不会返回任何违规行为。
版本是 7.2.2-1。
【问题讨论】:
-
那张桌子上有触发器吗?我对vertica不熟悉,所以我只是把它扔在那里。
-
据我所知 Vertica 不支持触发器。
-
您能否添加
event和client的 CREATE TABLE 以及确切的 UPDATE 语句 - 如果适用,您在同一事务中触发的一堆先前的 UPDATE 语句(假设您之前是否关闭了自动提交或触发了 BEGIN TRANSACTION)? -
event表中大约有 200 列,client中大约有 50 列,所以恐怕这个问题太多了。关于事务:我尝试在没有任何先前查询(以及来自不同会话和 DB 用户)的情况下以不同方式执行此查询,并且总是遇到相同的错误。 -
@Timurib 请发布 client.C_PRIMARY 约束?