php - MySQL - 如何在附加到 TEXT 字段之前检查值是否存在?
问题描述
在重复记录上,我想通过将字符串附加到表中的 TEXT 列来更新记录,条件是该 TEXT 列中不存在附加值。
到目前为止,我的查询已经完成
INSERT INTO events (event_id, event_types)
VALUES ("1", "partyEvent")
ON DUPLICATE KEY UPDATE event_types = CONCAT(event_types, ",testEvent")
是否对 MySQL 进行了此类检查,或者是否有必要获取记录并自己与 PHP 进行比较?
解决方案
它看起来像是event_types
一个非规范化字段,包含以逗号分隔的文本字符串序列。恕我直言,这是一个臭名昭著的数据库设计反模式。下一个编写您的代码的程序员确实会非常不高兴。
我会回答你的问题,即使它让我很痛苦。
首先,如何判断特定字符串是否出现在以逗号分隔的文本字符串集中?FIND_IN_SET()
可以做到这一点。
FIND_IN_SET('testEvent', event_types)
'testEvent'
如果出现在列中,则返回大于零的值。
所以我们可以在你的event_types =
条款中使用它。如果得出FIND_IN_SET
一个正数,您想要event_types = event_types
,即不变的值。如果没有,你想要你的问题。这该怎么做?使用IF(condition,trueval,falseval)
. 试试这个:
...UPDATE event_types = IF(FIND_IN_SET('testEvent',event_types) > 0,
CONCAT(event_types, ',', 'testEvent'),
event_types)
然而,有一个更好的方法。像这样创建一个名为event_types
defined 的新表。
CREATE TABLE event_types (
event_id INT(11) NOT NULL,
event_type VARCHAR(50) NOT NULL,
PRIMARY KEY (event_id, event_type)
)
这有一个复合主键,这意味着它不能有event_type
任何特定的重复值event_id
。
然后,您将使用此查询向事件添加类型:
INSERT IGNORE INTO event_types (event_id, event_type)
VALUES (1, 'testEvent');
IGNORE
如果已经存在重复,则告诉 MySQL 保持安静。
如果您必须将事件类型以逗号分隔以供某些程序处理,则此聚合查询GROUP_CONCAT()
将生成它们..
SELECT e.event_id, GROUP_CONCAT(t.event_type ORDER BY t.event_type) event_types
FROM events e
LEFT JOIN event_types t ON e.event_id = t.event_it
GROUP BY e.event_id
您可以像这样找到具有特定类型的所有事件。
SELECT event_id FROM event_types WHERE event_type='testEvent')
专业提示:逗号分隔:不好。标准化:好。
别担心,我们都犯过一次或两次这种设计错误。
推荐阅读
- session - 从 facelets 访问会话对象
- java - 使用 Room 库获取最近插入的行 ID
- email - Buddypress 在用户更新时为多个 xprofile 字段发送管理员电子邮件通知
- arrays - 错误:ARRAY 缺少其值的类型定义 Sequelize
- python - 使用 Flask 创建单引擎 sqlalchemy 的最佳方法
- javascript - Node.js + MySQL:双“?” 占位符
- reactjs - React hooks 参考值比较
- visual-studio-code - VS 代码。键入时禁用显示错误
- sh - SIGTERM 不会终止脚本
- javascript - 导航栏可以在我的电脑上使用,但不能在互联网上使用