我创建的数据库15年前设计得不好。我有一个varchar列,其中包含逗号分隔的字符串:'5,8,13'。字符串中不包含空格和尾随逗号,但值的数量是可变的。我想做的是创建一个新表,并将这些值与该行的ID配对移动到新表中。假设上述值来自ID为7的行,结果将是3行:
[ {7, 5} {7, 8} {7, 13} ]
查看现有数据集,该列的值从1到6个不等。我找到了一个线程,展示了如何使用拆分字符串函数:Split value from one field to two
但坦率地说,我不知道如何将其转化为单个插入操作。如果这不是一个简单的任务,那么我将只写一个PHP脚本,即使它会有很多插入语句。
进一步解释,这里有两个表:
create table Table_A( id int auto_increment primary key, platforms varchar(255) ) create table Table_B( id int auto_increment primary key, platform int not null )
Table_A是现有数据,其中platforms列中的数据是以逗号分隔的数字"3,45,"或"56,4"。这些数字指向另一个表中的索引。是的,我知道这是一个糟糕的设计,幸运的是,我从那时起已经学到了更好的方法。我想从Table_A的platform字符串中解析数字,并将它们与Table_A行的ID一起插入到Table_B中。
P粉9564410542023-09-11 14:04:03
这里有一个小查询来实现这个功能。它只从CSV中分割6个值。 如果一行中有更多的值,您必须更改UNION ALL
结果存储在singletable中。
MariaDB [bernd]> DESCRIBE singletable; +-----------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+------------------+------+-----+---------+----------------+ | id | int(11) unsigned | NO | PRI | NULL | auto_increment | | rno | int(11) | YES | | NULL | | | singleval | int(11) | YES | | NULL | | +-----------+------------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) MariaDB [bernd]> SELECT * FROM singletable; Empty set (0.00 sec) MariaDB [bernd]> MariaDB [bernd]> SELECT * FROM csvtable; +----+----------+ | id | csvvals | +----+----------+ | 1 | 1,3,5 | | 2 | 2,4 | | 3 | 6 | | 4 | 8,9 | | 5 | 22,21,20 | +----+----------+ 5 rows in set (0.00 sec) MariaDB [bernd]> MariaDB [bernd]> MariaDB [bernd]> INSERT INTO singletable (rno,singleval) -> SELECT id as rno , SUBSTRING_INDEX( SUBSTRING_INDEX(csvvals, ',', no) ,',',-1) singleval -> FROM csvtable -> CROSS JOIN (SELECT 1 as no UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6) as n -> WHERE no <= LENGTH(csvvals) - LENGTH(REPLACE(csvvals,',','')) +1 -> ORDER BY id,no; Query OK, 11 rows affected (0.01 sec) Records: 11 Duplicates: 0 Warnings: 0 MariaDB [bernd]> SELECT * FROM singletable; +----+------+-----------+ | id | rno | singleval | +----+------+-----------+ | 1 | 1 | 1 | | 2 | 1 | 3 | | 3 | 1 | 5 | | 4 | 2 | 2 | | 5 | 2 | 4 | | 6 | 3 | 6 | | 7 | 4 | 8 | | 8 | 4 | 9 | | 9 | 5 | 22 | | 10 | 5 | 21 | | 11 | 5 | 20 | +----+------+-----------+ 11 rows in set (0.02 sec) MariaDB [bernd]>