在不导出数据的情况下分隔mysql数据库中的数据

时间:2011-11-05 02:34:33

标签: mysql database delimited-text

是否可以在mysql数据库行中分隔数据? 我有超过约200万条目的数据,因此导出到csv并手动执行此操作不起作用,因为数据库拒绝转储数据。

数据格式为

url.com?some=0
url2.com?some=14

是否可以删除?以及之后的数据呢?

2 个答案:

答案 0 :(得分:4)

嗯,首先要做的事情。数据库的大小并不重要,MySQL 转储到CSV而不会出现问题。我成功地转储了包含两倍于您正在处理的记录数量的表。当然,其中一部分假设RAM和磁盘空间不是问题,可能并非如此。

关于过滤数据的问题,是的,这是可能的。我将假设您的列名为“url”,我的示例如下所示,所以请记住更改它,如果它被命名为其他名称。

实质上,您可以运行如下查询:

UPDATE tablename SET url = SUBSTRING_INDEX(url, "?", 1);

这会将URL的所有值更改为仅在第一次出现问号之前包含文本。

答案 1 :(得分:1)

您可以使用locatesubstring来删除这些字符串。例如:

mysql> select url, case when locate('?', url) = 0 then url else substring(url, 1, locate('?', url) - 1) end as truncated from urls;
+------------------+-----------+
| url              | truncated |
+------------------+-----------+
| url.com?some=0   | url.com   |
| url2.com?some=14 | url2.com  |
| url3.com         | url3.com  |
+------------------+-----------+

所以这应该可以解决问题:

update your_table
set url = case when locate('?', url) = 0 then url else substring(url, 1, locate('?', url) - 1) end

另一个选项是substring_index

mysql> select url, substring_index(url, '?', 1) from urls;
+------------------+------------------------------+
| url              | substring_index(url, '?', 1) |
+------------------+------------------------------+
| url3.com         | url3.com                     |
| url.com?some=0   | url.com                      |
| url2.com?some=14 | url2.com                     |
+------------------+------------------------------+

所以这也应该有效:

update your_table
set url = substring_index(url, '?', 1)