对于重复的记录,我想通过在表中的文本列中追加字符串来更新记录,条件是追加值在该文本列中不存在。我已经提出了我的问题
INSERT INTO events (event_id, event_types) VALUES ("1", "partyEvent") ON DUPLICATE KEY UPDATE event_types = CONCAT(event_types, ",testEvent")
mysql有这样的检查吗,或者我有必要获取记录并自己与php进行比较吗?
yjghlzjz1#
看起来像 event_types 是非规范化字段,包含以逗号分隔的文本字符串序列。恕我直言,这是一个臭名昭著的数据库设计反模式。下一个编写你的代码的程序员会非常不高兴。我会回答你的问题,尽管我很痛苦。首先,如何判断特定字符串是否出现在逗号分隔的文本字符串集中? FIND_IN_SET() 我能做到。
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) . 试试这个:
'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 .然后,您将使用以下查询向事件添加类型:
event_type
event_id
INSERT IGNORE INTO event_types (event_id, event_type) VALUES (1, 'testEvent');
这个 IGNORE 告诉mysql如果已经有了副本就保持安静。如果必须用逗号分隔事件类型以供某个程序处理,则此聚合查询 GROUP_CONCAT() 将产生它们。。
IGNORE
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')
专业提示:逗号分隔:错误。他:很好。别担心,我们都犯过一两次这样的设计错误。
1条答案
按热度按时间yjghlzjz1#
看起来像
event_types
是非规范化字段,包含以逗号分隔的文本字符串序列。恕我直言,这是一个臭名昭著的数据库设计反模式。下一个编写你的代码的程序员会非常不高兴。我会回答你的问题,尽管我很痛苦。
首先,如何判断特定字符串是否出现在逗号分隔的文本字符串集中?
FIND_IN_SET()
我能做到。返回大于零的值,如果
'testEvent'
出现在专栏里。所以我们可以用在你的电脑里
event_types =
条款。如果FIND_IN_SET
你想要一个正数吗event_types = event_types
,即一个不变的值。如果没有,你想知道你的问题是什么。怎么做?使用IF(condition,trueval,falseval)
. 试试这个:但是有一个更好的方法。创建一个名为
event_types
定义如下。它有一个复合主键,这意味着它不能有重复的主键
event_type
任何特定的event_id
.然后,您将使用以下查询向事件添加类型:
这个
IGNORE
告诉mysql如果已经有了副本就保持安静。如果必须用逗号分隔事件类型以供某个程序处理,则此聚合查询
GROUP_CONCAT()
将产生它们。。您可以找到所有具有这种特定类型的事件。
专业提示:逗号分隔:错误。他:很好。
别担心,我们都犯过一两次这样的设计错误。