Sqlite3没有按顺序插入多行

时间:2017-01-23 11:54:38

标签: node.js sqlite android-sqlite

我正在使用node js应用程序,数据库是sqlite3(2.15.8)。我正在使用sqlite3 module。在这里我必须按顺序插入行。 我有一个表tests,其中的行应该按照它们进入循环的顺序插入。

我的代码如下:

创建表格

GLOBAL.db1 = new sqlite3.Database(APPDATA+'/xyz/mydb.db');
var check;
db1.serialize(function() {

db1.run("CREATE TABLE IF NOT EXISTS tests (id INTEGER NOT NULL PRIMARY KEY , parent_name varchar(255), test_name varchar(255), test_alias varchar(255), sequences varchar(55), duration varchar(55), prog_id int(11), org_id int(11), test_createdby int(11), test_created varchar(20), test_modified varchar(11), test_status int(11))");
});

插入表格

try{

  db1.run("INSERT INTO programs (`prog_name`, `prog_exercises`, `prog_orgid`, `prog_createdby`, `prog_created`, `prog_modified`, `prog_status`)  VALUES (?,?,?,?,?,?,?)",program_name, JSON.stringify(step2PostedData), org_id, createdby, timestamp, timestamp, 0,function(err){
 // as it is single record insertion so inserting good obviously.

if(err){
 throw err;
}else{
 for (i in step2PostedData.testsInfo) {

  var c = 0;

   for(j in step2PostedData.testsInfo[i]){

   var obj = Object.keys(step2PostedData.testsInfo[i])[c];

   console.log(obj); // here I am getting correct order of test names in console

   db1.prepare("INSERT INTO `tests` ( `parent_name`,`test_name`, `test_alias`, `sequences`, `duration`, `prog_id`, `org_id`, `test_createdby`, `test_created`, `test_modified`, `test_status`) VALUES(?,?,?,?,?,?,?,?,?,?,?)").run('', obj, step2PostedData.testsInfo[i][j].alias, step2PostedData.testsInfo[i][j].sequences, step2PostedData.testsInfo[i][j].duration, this.lastID, org_id, createdby, timestamp, timestamp, 0);

     // Insertion is going in loop but order of insertion of rows is not same as per required                       

     c++;
     }
    }
   }
  });
 }catch(ex){
    throw ex;
 }

但是,当我在表中得到结果时,tests表中插入的行的顺序与我发送到循环中的顺序不一样。任何人都可以建议我应该改变什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

关系中没有顺序

关系中没有顺序(即人们通常错误地称之为“表”),因为关系是一个集合,而不是列表或数组。

如果人们没有错误地调用关系“表”,那么没有人会期望他们的订单。不幸的是,他们这样做会导致无数的误解,这种误解在我撰写文章时非常普遍:

简而言之 - 不要指望任何一组订单(包括关系)。如果需要订单,请在SQL中使用sort。如果您需要特定订单,请添加一个整数值,您可以对其进行排序以获得所需的订单。

(或者不使用关系数据库 - 还有其他类型的数据库支持排序结构,如数组。关系数据库不支持数组 - 至少它们不应该 - 并且在任何关系中都没有隐式顺序。 )