对于重复的记录,我想通过在表的TEXT列中附加一个字符串来更新记录,条件是该TEXT列中尚不存在附加值。
到目前为止,我的查询已经完成
INSERT INTO events (event_id, event_types)
VALUES ("1", "partyEvent")
ON DUPLICATE KEY UPDATE event_types = CONCAT(event_types, ",testEvent")
是否使用MySQL进行了这种检查,还是需要获取记录并使用PHP自己进行比较?
答案 0 :(得分:3)
看起来ssh -p 19999 officeuser@home
是一个非规范化字段,包含逗号分隔的文本字符串序列。相对而言,这是一个臭名昭著的数据库设计反模式。的确,下一个要处理您的代码的程序员会非常不高兴。
即使我很痛苦,我也会回答你的问题。
首先,如何分辨在逗号分隔的一组文本字符串中是否出现特定的字符串? FIND_IN_SET()
可以做到这一点。
event_types
如果列中显示FIND_IN_SET('testEvent', event_types)
,则返回大于零的值。
因此我们可以在您的'testEvent'
子句中使用它。如果event_types =
给出一个正数,则需要FIND_IN_SET
,即一个不变的值。如果没有,您想要您的问题。这该怎么做?使用IF(condition,trueval,falseval)
。试试这个:
event_types = event_types
但是,还有一种很多更好的方法。像这样定义一个名为 ...UPDATE event_types = IF(FIND_IN_SET('testEvent',event_types) > 0,
CONCAT(event_types, ',', 'testEvent'),
event_types)
的新表。
event_types
此键具有复合主键,这意味着它对于任何特定的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');
告诉MySQL如果已经存在副本则保持安静。
如果必须将事件类型用逗号分隔以便由某些程序处理,则此带有GROUP_CONCAT()
的聚合查询将产生它们。.
IGNORE
您可以找到具有特定类型的所有事件。
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
专业提示:逗号分隔:不好。标准化:好。
不用担心,我们都一次或两次犯了这个设计错误。