MySQL-如何在附加到TEXT字段之前检查值是否存在?

时间:2018-10-13 13:11:16

标签: php mysql

对于重复的记录,我想通过在表的TEXT列中附加一个字符串来更新记录,条件是该TEXT列中尚不存在附加值。

到目前为止,我的查询已经完成

INSERT INTO events (event_id, event_types)
VALUES ("1", "partyEvent")
ON DUPLICATE KEY UPDATE event_types = CONCAT(event_types, ",testEvent")

是否使用MySQL进行了这种检查,还是需要获取记录并使用PHP自己进行比较?

1 个答案:

答案 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

专业提示:逗号分隔:不好。标准化:好。

不用担心,我们都一次或两次犯了这个设计错误。