mysql - MySQL 在 NodeJS 中的重复键更新
问题描述
我将 NodeJS 与 MySQL 和 async/await 语句一起使用。我在 MySQL 表中有一个 UNIQUE 列,名为audioid
.
我需要检查是否存在音频。如果是这样,我需要更新一行。如果不是,我需要插入一行。我正在使用 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 } ] tagid 2nd = 0 ER_PARSE_ERROR:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“WHERE audioid = 26 ON DUPLICATE KEY UPDATE tagid1 = 0”附近使用正确的语法
解决方案
INSERT INTO entitytag (tagid1) VALUES (?) WHERE audioid = ?
ON DUPLICATE KEY UPDATE tagid1 = ?
在 SQL 基础上是错误的,因为 insert 创建了一个新行,所以没有 WHERE 条件适用。如果要指定应在 audioid 上进行重复检查,则应在该字段上使用 UNIQUE 属性在表上创建一个索引。
正确的查询(仅从语法的角度来看)是
INSERT INTO entitytag (tagid1) VALUES (?)
ON DUPLICATE KEY UPDATE tagid1 = ?
在没有样本数据、预期结果和表结构的情况下,这是一个猜测问题,但一个工作(功能)查询可能是:
INSERT INTO entitytag (tagid1, audioid) VALUES (?,?)
ON DUPLICATE KEY UPDATE tagid1 = ?
推荐阅读
- python - Pip 安装包与 Python 版本不兼容
- python - Python Asyncio - 似乎没有在异步模式下工作
- arrays - 如何迭代此数组以匹配所有可能的连接
- amazon-web-services - 谁能给我一个自定义 CloudWatch 事件模式的示例
- elm - 悬停在榆树(elm-ui)中时如何使文本删除线?
- python - 我如何知道 librosa 进行傅里叶变换的数据中的目标 Hz
- flutter - Flutter:列表已弃用?
- python - 如何匹配 Lark 中的开始和结束标签?
- python - 如何从 pytesseract 获得最佳结果?
- flutter - Flutter (\t) 字符串值对齐问题