Heim  >  Fragen und Antworten  >  Hauptteil

Manuelles Einfügen in eine MySQLx-Sammlung

Ich habe viele JSON-Daten, die ich in eine MySQLx-Sammlungstabelle einfügen muss. Die aktuelle Node-Implementierung stürzt immer wieder ab, wenn ich versuche, JSON-Daten zu laden. Ich vermute, dass das daran liegt, dass ich zu viele Daten auf einmal über die Sammlungs-API einfüge. Ich möchte mithilfe herkömmlicher SQL-Anweisungen manuell Daten in die Datenbank einfügen (hoffentlich helfen sie mir, diesen NodeJs-Absturz zu überstehen).

Das Problem ist, dass ich diese Tabellendefinition habe:

+--------------+---------------+------+-----+---------+-------------------+
| 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 |
+--------------+---------------+------+-----+---------+-------------------+

Aber beim Laufen 插入文档值('{}',DEFAULT,DEFAULT) Ich bekomme:

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

Ich habe versucht, keinen Standardwert anzugeben, indem ich NULL verwende (aber _id lässt NULL nicht zu, obwohl das die Standardeinstellung ist), 0 für _id verwende, Zahlen und uuid_to_bin(uuid()) verwende, aber ich bekomme immer noch das Gleiche Fehler.

So fügen Sie diese Daten direkt in die Tabelle ein (ich verwende session.sql('INSERT...').bind(JSON.stringify(data)).execute() – verwende die @mysql/xdevapi-Bibliothek)

P粉917406009P粉917406009240 Tage vor320

Antworte allen(1)Ich werde antworten

  • P粉191323236

    P粉1913232362024-02-22 09:33:46

    _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 连接器的首席开发人员

    Antwort
    0
  • StornierenAntwort