基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
LOB_WRITEAPPEND
更新时间:2026-09-15 17:00:16
LOB_WRITEAPPEND 用于在 UPDATE 语句中对 LONGTEXT 或 LONGBLOB 列做追加(流式)写入,以降低大 LOB 写入时的内存压力。同一 LOB 可在一个或多个事务中分多次追加;事务提交后,完整内容对其它会话可见。
说明
该函数从 V4.6.2.1 版本开始支持。
语法
UPDATE table_name
SET lob_column = LOB_WRITEAPPEND(lob_column, amount, buffer)
[WHERE condition];
参数说明
| 参数名称 | 类型 | 说明 |
|---|---|---|
lob_column |
LONGTEXT 或 LONGBLOB |
需要追加写入的目标 LOB 列,须与 SET 左侧为同一列。 |
amount |
整数 | 本次追加的数据长度,必须大于 0,且与 buffer 的实际长度完全一致。对 LONGTEXT 为字符长度;对 LONGBLOB 为字节长度。 |
buffer |
字符串、二进制字符串、LONGTEXT 或 LONGBLOB |
本次需要追加的数据。 |
使用限制与说明如下:
- 必须在
UPDATE ... SET ...中使用。 SET后只能有一个赋值语句。- 目标 LOB 列仅支持
LONGTEXT和LONGBLOB。 - 不支持
MERGE_ENGINE为delete_insert的表。 - 单次追加数据长度最大约为 512 MB。严格来说,因数据头本身需要占用一定空间,实际上限为
512 MB - 1 Byte - 48 Byte,即536,870,863字节。 - 累计追加数据长度最大约为 4 TB。严格来说,实际上限为
4 TB - 1 Byte,即4,398,046,511,103字节。 - 追加写的目标行只能有一行。
LOB_WRITEAPPEND的第一个参数(lob_column)必须与SET左侧的 LOB 列相同。- 不能嵌套在其他函数中使用。
- 目标 LOB 列不能为被依赖列,包括索引依赖、
GENERATED列、Trigger、CHECK等。 - 不能用于带
WITH CHECK OPTION的视图(View)。 LOB_WRITEAPPEND不是幂等操作:同一语句执行一次与执行多次结果不同,重复执行会重复追加数据。- 重试机制:服务端明确返回失败时,可认为本次追加未生效;若客户端超时、断连或响应丢失,结果不确定,不要直接重试相同语句,否则可能重复追加。重试时可先等待或读取原语句的最终响应,再决定后续操作。
示例
本示例展示了如何使用 LOB_WRITEAPPEND 将数据多次分片追加到 LONGTEXT 列中,并使用 SUBSTR 函数分段读取。
CREATE TABLE stream_store (
id INT PRIMARY KEY,
data LONGTEXT
);
START TRANSACTION;
INSERT INTO stream_store VALUES (1, '');
UPDATE stream_store
SET data = LOB_WRITEAPPEND(data, 3, 'ABC')
WHERE id = 1;
UPDATE stream_store
SET data = LOB_WRITEAPPEND(data, 3, 'DEF')
WHERE id = 1;
UPDATE stream_store
SET data = LOB_WRITEAPPEND(data, 3, 'GHI')
WHERE id = 1;
COMMIT;
-- 上述操作全部成功并提交后,等效于:
-- INSERT INTO stream_store VALUES (1, 'ABCDEFGHI');
SELECT data,
CHAR_LENGTH(data) AS char_len
FROM stream_store
WHERE id = 1;
返回结果如下:
+-----------+----------+
| data | char_len |
+-----------+----------+
| ABCDEFGHI | 9 |
+-----------+----------+
1 row in set
使用 SUBSTR 函数分段读取数据:
SELECT SUBSTR(data, 1, 3) AS first_part,
SUBSTR(data, 4, 3) AS second_part,
SUBSTR(data, 7, 3) AS third_part
FROM stream_store
WHERE id = 1;
返回结果如下:
+------------+-------------+------------+
| first_part | second_part | third_part |
+------------+-------------+------------+
| ABC | DEF | GHI |
+------------+-------------+------------+
1 row in set