我有一个使用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()
。
我会尝试提供一些说明 -
表b中的数据未知。没有办法说将group_concat_max_len设置为大于18的值。
我知道插入列的大小。
为什么group_concat需要前x个字符时才能获得4 GB数据?
当连接字符串长于10个字符时,应插入前10个字符。
感谢。
答案 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)。