有个SQL语句,同样的表数据,在mysql下执行没有问题,但是tidb下却更新不到数据。
tidb版本:4.0.3
SQL语句:
UPDATE ipb_itemlist a
SET a.invocode = (
SELECT
t1.feecodestat_code
FROM
fin_staticcode_feecode t1,
fin_invoicekind t2
WHERE
t1.feecodestat_type = t2.feecodestat_type
AND t2.isvalid = ‘1’
AND t2.invoice_kind = ‘03’
AND t1.feecode = a.feecode
),
a.invoname = (
SELECT
t1.feecodestat_name
FROM
fin_staticcode_feecode t1,
fin_invoicekind t2
WHERE
t1.feecodestat_type = t2.feecodestat_type
AND t2.isvalid = ‘1’
AND t2.invoice_kind = ‘03’
AND t1.feecode = a.feecode
),
a.prebalanceid = ‘CBD7F143C08243619F4234DA739CEC5C’
WHERE
1 = 1
AND INID = ‘303216382’
AND BALANCEFLAG = ‘0’
AND FEEDATE >= str_to_date( ‘2020-08-04 13:55:21’, ‘%Y-%m-%d %T’ )
AND FEEDATE <= str_to_date(
‘2020-08-04 14:02:58’,
‘%Y-%m-%d %T’)
表结构和数据:
fin_invoicekind.sql (5.4 KB) fin_staticcode_feecode.sql (46.4 KB) ipb_itemlist.sql (16.5 KB)
上面的SQL语句执行后,invocode和invoname两个字段的值仍然为null,这个效果是不对的,应该有值才对。
这道题我不会
(Lizhengyang@PingCAP)
2020 年8 月 4 日 06:54
3
请问一下,只根据下面这个 where 语句查询表ipb_itemlist a 的字段 feecode 值,在 mysql 和 tidb 中查询结果集有区别吗?
WHER
1 = 1
AND INID = ‘303216382’
AND BALANCEFLAG = ‘0’
AND FEEDATE >= str_to_date( ‘2020-08-04 13:55:21’, ‘%Y-%m-%d %T’ )
AND FEEDATE <= str_to_date(
‘2020-08-04 14:02:58’,
‘%Y-%m-%d %T’)
没有区别,值都是一样的。类型都是varchar 5
用附件的数据,应该能再现吧?
来了老弟
2020 年8 月 4 日 13:04
5
辛苦将你 tidb 和 mysql 中测试的结果贴出来看下
来了老弟
2020 年8 月 5 日 04:01
8
感谢反馈,
辛苦将 set 语句中,a.invocode ,a.invoname 对应的子查询结果反馈一下,感谢配合,
来了老弟
2020 年8 月 5 日 07:13
10
嗯,这边查看到 set 中有多个值,所以想看下目前环境的值为多少,可能是没有 order by 导致取出的数据没有顺序,辛苦确认下
这样关联查询肯定是多个值的。ipb_itemlist里面就有多条数据。
我们原始SQL语句的目的就是为了批量更新ipb_itemlist中字段的值,字段的值来自子查询的结果。
可以用上面附件的结构和数据在mysql建立一下,比较下差异。
注意调整下where条件的值,以便能取到多条数据。
来了老弟
2020 年8 月 5 日 07:51
13
辛苦返回下 mysql 和 tidb 的 sql_mode 吧,标准语法中对于 set 值需要单一值,不可为多行,否则将去第一行,tidb 目前对select 如果没有 order by 进行约束是不保证返回顺序的。
mysql下的sql_mode
STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
tidb下的sql_mode
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
不太理解您说的标准语法是啥。
但是,同样的语句,在oracle和mysql中都没有问题,但是tidb执行结果不正确。
来了老弟
2020 年8 月 5 日 09:16
15
mysql 中的更新值符合预期吗?是否是正确的值呢?执行下下面的 sql,看下
目前来看
SELECT
t1.feecodestat_name
FROM
fin_staticcode_feecode t1,
fin_invoicekind t2,ipb_itemlist a
WHERE
t1.feecodestat_type = t2.feecodestat_type
AND t2.isvalid = ‘1’
AND t2.invoice_kind = ‘03’
AND t1.feecode = a.feecode
返回结果为两行:
SELECT
t1.feecodestat_name
FROM
fin_staticcode_feecode t1,
fin_invoicekind t2,ipb_itemlist a
WHERE
t1.feecodestat_type = t2.feecodestat_type
AND t2.isvalid = ‘1’
AND t2.invoice_kind = ‘03’
AND t1.feecode = a.feecode;
返回结果为:
mysql和oracle的结果都符合预期,只有tidb的不符合。
可以参见先前的截图。
你这样的SQL语句对于排查问题是没有意义的,这样的查询结果是正常的,即便到mysql和oracle中也是如此。
我建议重新捋一下,在你们的环境中先再现一下这个问题。
可以用附件的结构和数据。
SQL语句中的where条件部分按数据只保留AND INID = ‘xxxx’这个部分。
其中的值按数据实际情况调整下。
如果有必要的话,我可以重新开一个帖子,直接准备好结构和数据以及能再现问题的语句。
来了老弟
2020 年8 月 5 日 09:40
20
tidb 与 mysql 的行为目前看是不一致的,但是也是怀疑当前更新数据的准确性,请问如何判断多行返回,set哪一行呢,
辛苦反馈下结果?