如何将 'on conflict do nothing' 从 PostgreSQL 迁移到 Snowflake?
How to migrate 'on conflict do nothing' from PostgreSQL to Snowflake?
我正在迁移大量 PostgreSQL 脚本以在 Snowflake 中工作。阻止我的问题是 on conflict
语法,特别是当您使用 on conflict do nothing
.
时
insert into table1
select
user_id
, something_else
from table2
on conflict do nothing;
一些人建议来自 Postgres 的 on conflict
的 "equivalent" 使用 merge into
、some are not happy about it。但是,当您使用 merge into
时,您必须指定一个 on <CONDITION>
子句,例如merge into t1 using t2 on t1.id = t2.id ...
。
但是在 on conflict do nothing
的情况下应该选择什么?
在这些情况下,使用 merge into
时是否有比指定每一列更简洁的语法? (假设你有 15 列,你必须写 每一列 )。
试试这个(假设您想使用 user_id 作为唯一性标准)
merge into table1
using (select user_id, something_else from table2) sub
on sub.user_id = table1.user_id
when not matched then insert values(sub.user_id, sub.something_else)
或者简单地删除具有现有 user_id
的行
insert into table1
select user_id, something_else from table2
where user_id not in (select user_id from table1)
或者,如果您只想防止整行重复,请执行
insert into table1 (
select user_id, something_else from table2
minus
select * from table1
)
我正在迁移大量 PostgreSQL 脚本以在 Snowflake 中工作。阻止我的问题是 on conflict
语法,特别是当您使用 on conflict do nothing
.
insert into table1
select
user_id
, something_else
from table2
on conflict do nothing;
一些人建议来自 Postgres 的 on conflict
的 "equivalent" 使用 merge into
、some are not happy about it。但是,当您使用 merge into
时,您必须指定一个 on <CONDITION>
子句,例如merge into t1 using t2 on t1.id = t2.id ...
。
但是在 on conflict do nothing
的情况下应该选择什么?
在这些情况下,使用 merge into
时是否有比指定每一列更简洁的语法? (假设你有 15 列,你必须写 每一列 )。
试试这个(假设您想使用 user_id 作为唯一性标准)
merge into table1
using (select user_id, something_else from table2) sub
on sub.user_id = table1.user_id
when not matched then insert values(sub.user_id, sub.something_else)
或者简单地删除具有现有 user_id
insert into table1
select user_id, something_else from table2
where user_id not in (select user_id from table1)
或者,如果您只想防止整行重复,请执行
insert into table1 (
select user_id, something_else from table2
minus
select * from table1
)