【发布时间】:2021-09-17 02:40:11
【问题描述】:
我将 NodeJS 与 MySQL 和 async/await 语句一起使用。我在名为 audioid 的 MySQL 表中有一个 UNIQUE 列。
我需要检查是否存在音频。如果是这样,我需要更新一行。如果不是,我需要插入一行。我正在使用 MySQL 的所以这里是查询;
try {
if(tag1){
row_b = await db.query( "SELECT tagid FROM tags WHERE tagname = ?", [tag1]);
if (row_b > 0){
const tagid1 = row_b[0].tagid;
console.log('tagid first = ' + tagid1);
row_c = await db.query(
"INSERT INTO entitytag (tagid1) VALUES (?) WHERE audioid = ?
ON DUPLICATE KEY UPDATE tagid1 = ?", [tagid1, audioid, tagid1]
);
}
else {
row_d = await db.query( 'INSERT IGNORE INTO tags (tagname) VALUES (?)', [tag1]);
const tagid1 = row_d.insertId;
console.log('tagid 2nd = ' + tagid1);
row_e = await db.query(
"INSERT INTO entitytag (tagid1) VALUES (?) WHERE audioid = ?
ON DUPLICATE KEY UPDATE tagid1 = ?", [tagid1, audioid, tagid1]
);
}
console.log('success!');
res.json('success!');
}
}
但是控制台出现错误;
[ RowDataPacket { tagid: 11 } ] 第二个标签 = 0 ER_PARSE_ERROR:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“WHERE audioid = 26 ON DUPLICATE KEY UPDATE tagid1 = 0”附近使用正确的语法
【问题讨论】:
-
@lelio-faieta cmets 和关于
ON DUPLICATE KEY UPDATE查询的答案是正确的。根据您的示例代码,您的目标似乎是维护相关表的键值。您还可以考虑利用foreign keys and referential actions、tablet riggers、存储过程或这些选项的任意组合。它们可能会为您节省一些时间和资源,具体取决于您在此特定情况下的架构和吞吐量。
标签: mysql node.js on-duplicate-key