Mysql使用逗号分隔值插入多行,仅使用sql语句

时间:2015-10-07 22:30:39

标签: mysql sql node.js

执行多个sql insert语句而不将它们运行到node.js等中的某种循环中的意图。

典型的sql语句如下所示。

INSERT INTO session_speaker(session_id, speaker_id) VALUES(?, ?);
INSERT INTO session_speaker(session_id, speaker_id) VALUES(?, ?);

OR

INSERT INTO session_speaker(session_id, speaker_id) VALUES(?, ?), (?, ?);

普通的node.js循环看起来像这样。

for (var i = 0; i < request.body.length; i++) {
    queryRequest.sql += "INSERT INTO session_speaker(session_id, speaker_id) VALUES(?, ?);";
    queryRequest.values.push(request.body[i].id, request.params.id);
}

意向/问题:

探索一种方法,如果可能的话,将request.body传递给一个智能SQL,它采用数组本身或者可能是逗号分隔的值列表,并在没有node.js循环的情况下从那里插入多行。

request.body看起来像这样(可以更改以满足要求)

[
  {
    "id": 12
  },
  {
    "id": 34
  }
]

2 个答案:

答案 0 :(得分:0)

是的,这是可能的。 看看这个参考。 https://dev.mysql.com/doc/refman/5.7/en/json.html

这是你可以做的。

  1. 选择对象数据
  2. 转换为数组
  3. unnest数组(在列视图中使make数组)引用:UNNEST function in MYSQL like POSTGRESQL,此函数需要一个字符串,所以将数据(数组)转换为数据(字符串)这里是引用:Is there a MySQL equivalent to PostgreSQL array_to_string
  4. 使用insert into select参考:https://dev.mysql.com/doc/refman/5.1/en/insert-select.html
  5. 最后,你的代码是这样的:

    insert  into session_speaker(session_id, speaker_id)  
    select unnest_mysql ( arrayToString (dataTOArray( stringtojson (json_string) ) ) )
    

    json_string =这是你的数据来自

    dataTOArray =此函数将您的数据转换为mysql json到数组

    dataTOArray =这是将数组转换为字符串ex。 [1,2,3]'1,2,3' unnest_mysql =您的字符串行数据

     string '1,2,3'
     --view like 
    
     |-------String-----|
     |---------1--------|
     |---------2--------|
     |---------3--------|
     |----------- ------|
     So when you insert this , it will become row in your table
    

    注意:将我的功能更改为MySQL特定功能。

答案 1 :(得分:0)

我认为这让我更接近我正在寻找的东西。

https://github.com/felixge/node-mysql/issues/814

根据dougwilson的评论以及他对嵌套数组的解决方案,我可以简单地将多对象数组传递给查询,它将一次插入多个记录。

var currentLogs = [
  [ 'Server', 'Socketio online', 'Port 3333', '2014-05-14 14:41:11' ],
  [ 'Server', 'Waiting for Pi to connect...', 'Port: 8082', '2014-05-14 14:41:11' ]
];

pool.query('INSERT INTO logs_debug (socket_id,message,data,logged) VALUES ?', [currentLogs])