【DM版本】: dm8
【操作系统】: windows server 2016
【CPU】: x86
【问题描述】:
现有包含自增ID的 PERSON 表:
CREATE TABLE PERSON (
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(20) NULL
);
插入记录后无法获取自动生成的 ID,node.js 代码如下:
const db = require("dmdb");
// 基础测试
db.createPool({
connectString: "dm://sysdba:dmpassw0rd@localhost:5236",
poolMin: 1,
poolMax: 1,
queueMax: 20
}).then(function(pool) {
pool.getConnection(function(err, conn) {
if (err) {
console.error(err);
return
}
conn.execute(`INSERT INTO PERSON(name) VALUES(?);`
, ['xyz'], function(err, result) {
if (err) {
console.error(err);
return
}
console.log(result);
conn.release();
pool.close();
});
});
}) .catch(function(err) {
console.log(err);
});
输出结果:
{ rowsAffected: 1 }
如果在执行的 SQL 后 增加 select SCOPE_IDENTITY() as insertId,输出结果:
{ metaData: [ { name: 'INSERTID' } ], rows: [ [ null ] ] }
其他方案:
用序列来解决吧,达梦在使用风格上更像ORACLE,而insertId 其实是 mysql 的糟粕设计,互联网应用比较广泛,但是企业级开发到处都需要基于多条SQL的上下文来编程,这个时候序列就非常重要了。
先创建序列:
CREATE SEQUENCE REGION_ID_REQ INCREMENT BY 1 START WITH 10000;
然后在插入时使用序列:
INSERT INTO x(id, a, b) VALUES(REGION_ID_REQ.nextval);
最后获取序列的当前值:
SELECT REGION_ID_REQ.currval;
可以尝试如下的写法
declare id int; begin insert into PERSON(name) values(sysdate) return id into id; end;