mysql-如何在附加到文本字段之前检查值是否存在?

ne5o7dgx  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(288)

对于重复的记录,我想通过在表中的文本列中追加字符串来更新记录,条件是追加值在该文本列中不存在。
我已经提出了我的问题

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

mysql有这样的检查吗,或者我有必要获取记录并自己与php进行比较吗?

yjghlzjz

yjghlzjz1#

看起来像 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 定义如下。

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

专业提示:逗号分隔:错误。他:很好。
别担心,我们都犯过一两次这样的设计错误。

相关问题