首页 > 解决方案 > 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 进行比较?

标签: phpmysql

解决方案


它看起来像是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_typesdefined 的新表。

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')

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

别担心,我们都犯过一次或两次这种设计错误。


推荐阅读