如何向表中插入重复标签/字符串数据及读取重复<deviMessage>标签内容
问题1:如何向数据库表中插入重复的标签或字符串数据?
这个得看你的表结构有没有限制重复值:
- 如果目标字段没有设置唯一约束,那直接用常规的INSERT语句就能轻松插入重复数据,举个MySQL的例子:
INSERT INTO tag_table (tag_content) VALUES ('重复标签A'), ('重复标签A'), ('重复标签B'); - 如果字段加了唯一约束,但你确实需要存重复值,那得调整下结构:
- 方案一:给表加个自增主键,让每条记录都有唯一标识,这样即使标签重复也能插入:
之后再执行INSERT就没问题了。ALTER TABLE tag_table ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY; - 方案二:如果是要把重复标签和其他主数据关联,不如建个关联表,比如主表存业务数据,关联表专门存标签,这样同一个标签可以反复关联不同的主记录:
CREATE TABLE tag_links ( id INT AUTO_INCREMENT PRIMARY KEY, business_id INT, tag_content VARCHAR(255), FOREIGN KEY (business_id) REFERENCES business_table(id) );
- 方案一:给表加个自增主键,让每条记录都有唯一标识,这样即使标签重复也能插入:
问题2:读取所有重复标签内容并插入表中
首先看你给的字符串,里面是转义后的XML(用<代替<,>代替>),而且还有个小格式错误:< deviations>多了空格,应该是<deviations>,后面的 deviations>要改成</deviations>,先修正这个才能正常解析。
我给你两种常用的解决方式:
用Python处理(适合批量或复杂场景)
先把转义字符还原,再解析XML提取所有
import xml.etree.ElementTree as ET import mysql.connector # 原始字符串 raw_xml_str = "<loan><applicant><partyReference>string</partyReference>< deviations><deviMessage>read this data</deviMessage><deviSeverity>L2</deviSeverity><approvalAuth>CCM</approvalAuth><istest>NO</istest></deviations> deviations><deviMessage>read thid data2</deviMessage><deviSeverity>L2</deviSeverity><approvalAuth>CCM</approvalAuth><istest>NO</istest></deviations> <Numerator>0.036848584684376046</Numerator></loan>" # 1. 还原转义字符 + 修正XML格式错误 clean_xml = raw_xml_str.replace('<', '<').replace('>', '>') clean_xml = clean_xml.replace('< deviations>', '<deviations>').replace(' deviations>', '</deviations>') # 2. 解析XML提取所有deviMessage内容 root = ET.fromstring(clean_xml) all_messages = [msg.text.strip() for msg in root.findall('.//deviMessage')] # 3. 批量插入数据库(以MySQL为例) db_conn = mysql.connector.connect( host='你的数据库地址', user='用户名', password='密码', database='数据库名' ) cursor = db_conn.cursor() # 批量插入语句 insert_sql = "INSERT INTO message_table (content) VALUES (%s)" cursor.executemany(insert_sql, [(msg,) for msg in all_messages]) db_conn.commit() # 关闭连接 cursor.close() db_conn.close()
用SQL直接处理(适合MySQL 8.0+)
如果你的数据库支持XML函数,可以直接在SQL里完成解析和插入:
-- 假设原始字符串存在source_table的content字段中 INSERT INTO target_table (message_content) SELECT devi_msg FROM source_table, XML_TABLE( -- 先还原转义字符并修正格式 REPLACE(REPLACE(content, '<', '<'), '>', '>') PASSING '//deviMessage' AS path COLUMNS devi_msg TEXT PATH '.' ) AS msg_table;
内容的提问来源于stack exchange,提问作者Vaibhav Save
相关产品推荐
相关产品推荐

