你好,我们用的1.11版本。

需求:table t 有三个字段(a,b,c)
我们的场景只想根据主键a更新部分字段b,其余的字段c原有的值保持不变,

例如mysql 支持:
insert into t(a,b) select 1,2 on duplicate key update b=2;  
主键重复的时候只更新字段b,字段c的值不变。
但是flink sql 目前只支持全字段更新:insert into t(a,b,c) select 1,2,3 。
我在sql-client测试了一下:insert into t(a,b) select 1,2 on duplicate key update b=2;  
会报错 不支持 on duplicate key update
同时也测试了一下:insert into t(a,b) select 1,2  也会报错,字段数量不匹配;
[ERROR] Could not execute SQL statement. Reason:
org.apache.flink.table.api.ValidationException: Column types of query result 
and sink for registered table 'default_catalog.default_database.t' do not match.
Cause: Different number of columns.
我查看了https://issues.apache.org/jira/browse/FLINK-18726
使用最新版的1.13  sql-client测试了一下 insert into t(a,b) select 1,2 
,相比1.11版本报错,1.13可以执行成功.但是发现和文档中描述的一样,字段c会插入null。如果原有的一条数据是1,2,3执行sql后会变成1,2,null,会造成字段c的数据丢失,这是不允许的。
请问这种根据主键更新部分字段的场景 使用flink sql应该怎么处理?

在 2021-08-02 15:39:09,"silence" <[email protected]> 写道:
>用的什么版本这个应该已经在1.13中修复了https://issues.apache.org/jira/browse/FLINK-18726
>不行的话可以在ddl中限制列的数量
>
>
>------------------------------------------------------------------
>发件人:Ye Chen <[email protected]>
>发送时间:2021年8月2日(星期一) 11:37
>收件人:user-zh <[email protected]>; silence <[email protected]>
>主 题:Re:回复:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?
>
>你好,我试了一下,如果表的ddl是三个字段,但是insert只指定两个字段的话,会报错:
>[ERROR] Could not execute SQL statement. Reason:
>org.apache.flink.table.api.ValidationException: Column types of query result 
>and sink for registered table 'default_catalog.default_database.t' do not 
>match.
>Cause: Different number of columns.
>我们的需求是想根据主键更新部分字段
>-------------------------------------
>需求:现有table 
>CREATE TABLE t (
> a        bigint,
> b        bigint,
> c        bigint,
>  PRIMARY KEY (a) NOT ENFORCED
>) WITH (
>...
>);
>我们的场景只想根据主键a更新部分字段b,其余的字段c保持不变,
>例如mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key update 
>b='4';主键重复的时候只更新字段b,字段c的值不变。
>我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
>请问这种根据主键更新部分字段的场景 使用flink sql应该怎么处理?
>
>
>在 2021-08-02 10:47:55,"silence" <[email protected]> 写道:
>>如果只想更新部分字段的话可以试下
>>insert into t(a,b) select a,b from xxxxx
>>
>>
>>------------------------------------------------------------------
>>发件人:Ye Chen <[email protected]>
>>发送时间:2021年7月30日(星期五) 17:57
>>收件人:user-zh <[email protected]>
>>主 题:场景题:Flink SQL 不支持 INSERT INTO… ON DUPLICATE KEY UPDATE ?
>>
>>现有table 
>>CREATE TABLE t (
>> a        bigint,
>> b        bigint,
>> c        bigint,
>>  PRIMARY KEY (a) NOT ENFORCED
>>) WITH (
>>...
>>);
>>
>>
>>我们的场景只想根据主键a更新部分字段b,其余的字段保持不变,例如
>>mysql 支持   insert into t(a,b,c) select '1','2','3' on duplicate key update 
>>b='4';
>>主键重复的时候只更新字段b,字段c的值不变
>>
>>
>>我在官方文档中没找到这个用法,sql-client也测试了一下也不支持 on duplicate key update,会报错。
>>请问这种部分字段更新的场景 使用flink sql应该怎么处理?
>>
>>
>
>
>

回复