手动插入JSON到MySQLx Collection时生成列_id报错求助
解决MySQLx Collection表手动SQL插入的问题
问题根源
你的错误是因为插入语句中包含了生成列(_id是STORED GENERATED,_json_schema是VIRTUAL GENERATED),这类列的值由数据库自动计算生成,不允许手动指定任何值(包括DEFAULT、NULL或自定义值)。
正确的SQL插入方式
只需要指定可写入的doc列,让数据库自动处理生成列:
INSERT INTO documents (doc) VALUES ('{}');
结合@mysql/xdevapi的Node.js实现
单条数据插入
const targetData = { /* 你的JSON数据 */ }; await session.sql('INSERT INTO documents (doc) VALUES (?)') .bind(JSON.stringify(targetData)) .execute();
批量数据插入(分批次避免崩溃)
如果数据量极大,建议分批次插入(比如每批次1000条),避免内存过载:
const batchSize = 1000; const allData = [/* 你的大量JSON数据数组 */]; for (let i = 0; i < allData.length; i += batchSize) { const batch = allData.slice(i, i + batchSize); // 生成对应数量的占位符 const placeholders = batch.map(() => '(?)').join(', '); // 绑定所有批次的JSON字符串 await session.sql(`INSERT INTO documents (doc) VALUES ${placeholders}`) .bind(...batch.map(item => JSON.stringify(item))) .execute(); }
补充说明
- 分批次插入时可根据服务器性能调整
batchSize,平衡插入速度和内存占用 - 若需要自定义
_id,需先修改表结构取消其生成列属性,但不建议这么做(破坏Collection表的原生设计)
内容的提问来源于stack exchange,提问作者Joel Nation
相关产品推荐
相关产品推荐

