Hologres INSERT ON CONFLICT 语法不支持 多个values直接insert是嘛?这么执行主键冲突时直接报:INSERT INTO test1 (a, b, c) VALUES (1, 1, 1),(1,2,3)
ON CONFLICT (a)
DO UPDATE SET b = EXCLUDED.b, c = EXCLUDED.c,a= EXCLUDED.a;
INSERT ON CONFLICT 不支持批量更新是嘛?
是的,Hologres的INSERT ON CONFLICT语法暂时不支持多个values的直接插入。你需要为每个values执行一次INSERT ON CONFLICT语句。这是Hologres的一个限制,可能在未来版本的Hologres中得到改进。
对于你提供的例子,你可以这样修改:
INSERT INTO test1 (a, b, c) VALUES (1, 1, 1)
ON CONFLICT (a)
DO UPDATE SET b = EXCLUDED.b, c = EXCLUDED.c, a = EXCLUDED.a;
INSERT INTO test1 (a, b, c) VALUES (1, 2, 3)
ON CONFLICT (a)
DO UPDATE SET b = EXCLUDED.b, c = EXCLUDED.c, a = EXCLUDED.a;
这样,当主键冲突时,Hologres会更新对应的主键值。
https://help.aliyun.com/zh/hologres/user-guide/insert?spm=a2c4g.11186623.0.i117
目前INSERT只支持以下两种数据写入方式:
insert into values:
INSERT INTO holo2mysqltest (cate_id, cate_name) VALUES
(3, 'true'),
(3, 'fale'),
(3, 'trxxue'),
(3, 'x'),
(4, 'The Dinner Game');
insert into select:
INSERT INTO test2
SELECT * FROM test1;
在Hologres中,INSERT ON CONFLICT语法是支持批量插入和冲突处理的。您可以使用INSERT ... VALUES子句来一次性插入多个值,并且在主键冲突时使用ON CONFLICT子句执行更新。
下面是一个示例,演示了如何在INSERT语句中一次性插入多个值并处理冲突:
INSERT INTO test1 (a, b, c)
VALUES
(1, 1, 1),
(2, 2, 2),
(3, 3, 3)
ON CONFLICT (a)
DO UPDATE SET b = EXCLUDED.b, c = EXCLUDED.c;
上述示例中,我们通过一个INSERT语句一次性插入了三行数据。如果遇到主键冲突(即a
列重复),则使用ON CONFLICT子句指定的冲突解决方式进行更新。
是的,Hologres当前不支持在单个INSERT ON CONFLICT
语句中插入多个VALUES
。因此,你需要为每个值单独执行INSERT ON CONFLICT
。
下面是一个示例,演示如何为每对值分别执行INSERT ON CONFLICT
:
-- 插入第一条数据
INSERT INTO test1 (a, b, c) VALUES (1, 1, 1)
ON CONFLICT (a)
DO UPDATE SET b = EXCLUDED.b, c = EXCLUDED.c;
-- 插入第二条数据
INSERT INTO test1 (a, b, c) VALUES (1, 2, 3)
ON CONFLICT (a)
DO UPDATE SET b = EXCLUDED.b, c = EXCLUDED.c;
这种方法虽然可以避免主键冲突时直接报错,但是需要多次执行SQL语句,可能会导致性能下降。如果要处理大量数据的批量插入,你可以考虑使用其他方法,如批量导入工具或者编写自定义脚本等。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
本技术圈将为大家分析有关阿里云产品Hologres的最新产品动态、技术解读等,也欢迎大家加入钉钉群--实时数仓Hologres交流群32314975