手动插入 MySQLx 集合
P粉917406009
P粉917406009 2024-02-21 19:01:38
0
1
397

我有大量 JSON 数据需要插入到 MySQLx Collection 表中。当我尝试加载 JSON 数据时,当前的 Node 实现不断崩溃,我怀疑这是因为我通过集合 API 一次插入了太多数据。我想使用传统的 SQL 语句手动将数据插入数据库(希望它们能让我度过这次 NodeJs 崩溃)。

问题是我有这个表定义:

+--------------+---------------+------+-----+---------+-------------------+
| Field        | Type          | Null | Key | Default | Extra             |
+--------------+---------------+------+-----+---------+-------------------+
| doc          | json          | YES  |     | NULL    |                   |
| _id          | varbinary(32) | NO   | PRI | NULL    | STORED GENERATED  |
| _json_schema | json          | YES  |     | NULL    | VIRTUAL GENERATED |
+--------------+---------------+------+-----+---------+-------------------+

但是运行时 插入文档值('{}',DEFAULT,DEFAULT) 我得到:

ERROR 3105 (HY000): The value specified for generated column '_id' in table 'documents' is not allowed.

我尝试过不提供默认值,使用NULL(但_id不允许NULL,即使这是默认值),使用0表示_id,使用数字和uuid_to_bin(uuid()),但我仍然得到同样的错误。

如何直接将此数据插入表中(我正在使用 session.sql('INSERT...').bind(JSON.stringify(data)).execute() - 使用 @mysql/ xdevapi 库)

P粉917406009
P粉917406009

全部回复(1)
P粉191323236

_id 列是根据 JSON 文档中同名字段的值自动生成的。当您使用 CRUD 接口插入文档时,X Plugin 能够为此字段生成唯一值。然而,通过执行简单的 SQL 语句,您也绕过了该逻辑。因此,如果您自己生成 _id,您就可以插入文档,否则您将遇到该错误。

作为示例(使用 crypto .randomInt()):

const { randomInt } = require('crypto')

session.sql('insert into documents (doc) values (?)')
  .bind(JSON.stringify({ _id: randomInt(Math.pow(2, 48) - 1) }))
  .execute()

虽然我对 CRUD API 的问题很好奇,并且想看看我是否也能够重现它。在这种情况下,您如何插入这些文档以及当它“崩溃”时提供什么样的反馈(如果有)?

免责声明:我是 Node.js 的 MySQL X DevAPI 连接器的首席开发人员

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板