我正在使用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
表中插入的行的顺序与我发送到循环中的顺序不一样。任何人都可以建议我应该改变什么?
谢谢!
答案 0 :(得分:2)
关系中没有顺序(即人们通常错误地称之为“表”),因为关系是一个集合,而不是列表或数组。
如果人们没有错误地调用关系“表”,那么没有人会期望他们的订单。不幸的是,他们这样做会导致无数的误解,这种误解在我撰写文章时非常普遍:
简而言之 - 不要指望任何一组订单(包括关系)。如果需要订单,请在SQL中使用sort
。如果您需要特定订单,请添加一个整数值,您可以对其进行排序以获得所需的订单。
(或者不使用关系数据库 - 还有其他类型的数据库支持排序结构,如数组。关系数据库不支持数组 - 至少它们不应该 - 并且在任何关系中都没有隐式顺序。 )