为什么kudu在插入重复的主键时没有失败?

jutyujz0  于 2021-06-26  发布在  Impala
关注(0)|答案(1)|浏览(1009)

来自impala文件:
在大多数关系数据库中,如果尝试插入已插入的行,则插入将失败,因为主键将被复制。不过,impala不会使查询失败。相反,它将生成一个警告,但会继续执行insert语句的其余部分。
为什么 Impala /Kudu会这样?请注意,insert不会更新值(有一个upsert命令),它只会默默地失败。
有没有办法知道我正在插入一个重复的主键?

xpszyzbs

xpszyzbs1#

这是因为kudu本身不会抛出任何异常(只引发警告),因此impala会(正确地)假设任务成功。
至于Kudu为什么选择这样做,我们只能猜测。
这只是我的意见。kudu(和impala)设计用于分析工作负载,而不是事务工作负载。通常需要对大量数据进行批处理。不希望应用程序因为具有重复密钥的记录数量少而失败。
因此,默认行为将插入具有非重复键的所有记录,并跳过所有重复键。这可以通过使用 upsert 替换重复的。
根据imapala文件
如果insert语句尝试插入主键列值与现有行相同的行,则丢弃该行并继续insert操作。当由于主键重复而丢弃行时,语句将以警告而不是错误结束(这是对kudu早期版本的一个更改,在这种情况下,默认情况下返回错误,并且需要使用insert ignore语法才能使语句成功。ignore子句不再是insert语法的一部分。)
对于希望用重复的主键值替换行而不是丢弃新数据的情况,可以使用upsert语句而不是insert语句。upsert插入全新的行,对于与表中现有主键匹配的行,将更新非主键列以反映“upserted”数据中的值。
如果确实要存储新行,而不是替换现有行,但由于主键唯一性约束而无法这样做,请考虑使用包含在主键中的其他列重新创建表。

相关问题