使用mysql node.js批量插入时出现Sql语法错误

时间:2018-03-26 13:47:43

标签: mysql node.js node-mysql

我正在使用mysql节点模块。

我的查询是:

insert into myTableA (fk_1, fk_2)
values (
    (select id from myTableB where name = ?),
    (select id from myTableC where name = ?)
)

我的方法调用如下:

db.query(q, [values], (err) => { ... })

values中的每个项目都是一个数组,其项目分别是myTableBmyTableC中的名称。如上所示,我确保将values包装在另一个数组中。

我得到的错误是:

  

ER_PARSE_ERROR:您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在...“

附近使用正确的语法

请帮助......

编辑1:

我想要插入的值如下所示:

var values = [
    [name00, name01],
    [name10, name11],
    [name20, name21],
    ...
]

编辑2:

这里是为了澄清我的困惑......基本上,我正在寻找一种方法,允许我使用INSERT INTO查询来组合以下2个查询:

INSERT INTO MyTable (col_1, col_2, col_3) VALUES ?

INSERT INTO MyTableA (col_1, col_2, col_3) VALUES (
    (select id from MyTableB where name=?),
    (select id from MyTableC where name=?),
    ?
)

我正在寻找的查询将允许我以下列形式传递values变量:

var values = [
    [row_0_col_1, row_0_col_2, row_0_col_3], 
    [row_1_col_1, row_1_col_2, row_1_col_3], 
    [row_2_col_1, row_2_col_2, row_2_col_3], 
    ...
]

2 个答案:

答案 0 :(得分:0)

尝试使用SQL Join功能,从多个表中插入选定的值。

供您参考的示例:

INSERT INTO Table (aID, bID) 
     SELECT a.ID, B.ID 
     FROM A, B 
     WHERE A.Name='Me'
     AND B.Class='Math';

答案 1 :(得分:0)

C似乎是一个多对多表,您尝试将这些行填充为gitmyTableA的外键引用。

使用myTableB语法,您可以指定数据值行,但必须指定每一行。像这样:

myTableC

每一行都是独立且独立的。如果使用子查询,则每个子查询必须返回单个值(这称为标量子查询)。您不能使用返回多个值的子查询。

您也可以使用INSERT ... VALUES语法,因此INSERT不是逐个列出行,而是使用SELECT语句返回的行。

INSERT INTO myTableA (fk_1, fk_2) VALUES
  ('name00', 'name01');
  ('name10', 'name11');
  ('name20', 'name21');

但是你必须提供一些连接表达式来描述如何匹配连接中两个相应表的值。

这需要凭空发明多对多的关系。

对于节点返回的语法错误,您在上面的帖子中包含的错误会在您键入INSERT ... SELECT的位置被截断。这不是一个完整的错误消息。您发布的查询显然已经过编辑(我猜您的表名不是INSERT INTO myTableA (fk_1, fk_2) SELECT b.id, c.id FROM myTableB JOIN myTableC ON (...); ...等。您正在寻求帮助,但您既未提供您执行的真实查询,也未提供真正的错误消息。鉴于此,Stack Overflow上的任何人都无法猜测错误的原因或任何修复错误。