【问题标题】:MySQL update field in row if it doesn't contain valueMySQL 更新行中的字段,如果它不包含值
【发布时间】:2019-03-12 09:38:04
【问题描述】:

我有一个表,其中有一个逗号分隔的列表(以 VARCHAR 的形式),如果该列表中的用户 ID 不存在,我想更新该列表。

我正在从 Node.js 应用程序运行语句。我不完全确定我将如何通过 SQL 语句来做到这一点。这是我所拥有的:

'UPDATE `tablename` SET `t` = "' + memberId + '" WHERE rowId = ' + id

这将替换整个记录。我只想将 memberId 添加到 t 如果它不存在。

t 看起来像这样:'1652,47,245,783,2,3,55,738,2306';

所以如果我想在上面加上 15,它应该是 '1652,47,245,783,2,3,55,738,2306,15';

我想在 SQL 语句中执行此操作,而不是拉取字段数据,然后将其添加到 JavaScript (Node.js) 中的字符串中,然后更新记录。

【问题讨论】:

  • 首先不要使用逗号分隔的值。规范化您的架构。

标签: mysql node.js


【解决方案1】:

使用FIND_IN_SET 分析您的字符串值并确定该ID 是否存在于该逗号分隔列表中。

在此处查看FIND_IN_SET 的完整文档:

https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_find-in-set

伪查询是:

UPDATE `tablename` SET `t` = CONCAT(t, ',15) 
WHERE rowId = ${rowId} AND FIND_IN_SET('15', t) = 0

当然,根据需要插入 ${rowId} 以构建您的查询。

【讨论】:

  • 如果列表中有 1500 或 1815 之类的数字,这会是一个问题吗?
  • 修复错字后有效。如果 t 为空怎么办?在那种情况下,我不想在数字前插入逗号
  • 是的,由于您指出的原因,它相当脆弱。更好的解决方案是按照其他 cmets 的建议重新设计架构。
  • 对...很多其他人也是这么说的。不幸的是,在我的情况下,我不是数据库人员,我只是想完成这项工作=/
  • Cody,如果我想删除列表中的那个 id 怎么办?显然,如果我从 t 中删除 15,我不想删除/更改说 3015 或 1152 的项目...
猜你喜欢
  • 2010-09-14
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 2019-01-10
相关资源
最近更新 更多