避免在插入时由于GROUP_CONCAT错误而切换行而不更改group_concat_max_len

时间:2014-07-01 16:56:59

标签: mysql sql

我有一个使用GROUP_CONCAT的插件。在某些情况下,插入失败,行XX被GROUP_CONCAT剪切。我理解为什么它会失败,但我正在寻找一种方法让它没有错误,因为插入列已经小于group_concat_max_len。我不想增加group_concat_max_len。

drop table if exists a;
create table a (x varchar(10), c int);

drop table if exists b;
create table b (x varchar(10));

insert into b values ('abcdefgh');
insert into b values ('ijklmnop');

-- contrived example to show that insert column size varchar(10) < 15
set session group_concat_max_len = 15;

insert into a select group_concat(x separator ', '), count(*) from b;

此插入产生错误Row 2 was cut by GROUP_CONCAT()

我会尝试提供一些说明 -

  1. 表b中的数据未知。没有办法说将group_concat_max_len设置为大于18的值。

  2. 我知道插入列的大小。

  3. 为什么group_concat需要前x个字符时才能获得4 GB数据?

  4. 当连接字符串长于10个字符时,应插入前10个字符。

  5. 感谢。

3 个答案:

答案 0 :(得分:2)

您的示例GROUP_CONCAT可能会提高此值:

 abcdefgh, ijklmnop

这是18个字符长,包括分隔符。

你能尝试这样的事吗?

set session group_concat_max_len = 4096;
insert into a 
select left(group_concat(x separator ', '),10), 
       count(*) 
 from b;

这将为您修剪GROUP_CONCAT结果。

如果需要,您可以暂时设置group_concat_max_len,然后将其重新设置。

答案 1 :(得分:0)

我不太了解MySQL,也没有充分理由这样做,但是你可以创建一个运行的总长度,并将GROUP_CONCAT()限制在该长度所在的位置如果达到某个最大值,您仍然需要将group_concat_max_len设置得足够高以处理最长的单个值(或利用CASE逻辑将它们子串,使其低于您想要的最大长度。

这样的事情:

SELECT SUBSTRING(GROUP_CONCAT(col1 separator ', '),1,10)
FROM (SELECT *
      FROM (SELECT col1
                  ,@lentot := COALESCE(@lentot,0) + CHAR_LENGTH(col1) AS lentot
            FROM Table1
            )sub
      WHERE lentot < 25
     )sub2

演示:SQL Fiddle

我不知道它是SQL小提琴是否古怪或是否存在逻辑问题,但有时在运行时我没有输出。在MySQL上不是很大,所以肯定是我错过了什么。它似乎不应该需要2个子查询,但过滤不能按预期工作,除非它是嵌套的。

答案 2 :(得分:0)

实际上,更好的方法是使用DISTINCT。 我有一种情况,要将两个新字段添加到现有存储过程中,其方式是通过LEFT JOIN获得该新字段的值,并且由于其中可能包含NULL值,因此将单个“ concat”值相乘在某些情况下超过100倍。 因为,具有该新字段值的组包含许多NULL值,所以GROUP_CONCAT超过了最大值(在我的情况下为16384)。