板凳-------Mysql cookbook学习 (十二--------4)

发布于:2025-07-22 ⋅ 阅读:(13) ⋅ 点赞:(0)

11.0 概述 386
11.1 使用LOAD DATA和mysqlimport导入数据 390

首先创建 mytbl_3 表(结构与 mytbl 相同):

sql
CREATE TABLE mytbl_3 LIKE mytbl;

用文本编辑器(如 Notepad++)打开 mytbl.txt,确保格式转换成window
mysql> TRUNCATE TABLE mytbl_3;
Query OK, 0 rows affected (0.09 sec)

mysql>
mysql> LOAD DATA LOCAL INFILE 'D:\\sql\\MySQL_cookbook\\mysqlcookbook-master\\recipes\\transfer\\load-examples\\mytbl.txt'INTO TABLE mytbl_3
    -> FIELDS TERMINATED BY ':'
    -> LINES TERMINATED BY '\n'
    -> (@col1, @col2)
    -> SET col1 = IF(@col1 REGEXP '^".*"$',
    ->               TRIM(BOTH '"' FROM REPLACE(@col1, '""', '"')),
    ->               @col1),
    ->     col2 = IF(@col2 REGEXP '^".*"$',
    ->               TRIM(BOTH '"' FROM REPLACE(@col2, '""', '"')),
    ->               @col2);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from mytbl_3;
+------+-------+
| col1 | col2  |
+------+-------+
  |bc  | def
  |hi  | jkl
  | n  | o p
 |m"n  | o"p"
+------+-------+
4 rows in set (0.00 sec)


TRUNCATE TABLE mytbl;  -- 清空表数据
C:\Users\lenovo>mysqlimport -u cbuser -p --local --fields-terminated-by=":" --fields-optionally-enclosed-by="\"" --fields-escaped-by="\"" --lines-terminated-by="\r\n" cookbook "D:\sql\MySQL_cookbook\mysqlcookbook-master\recipes\transfer\load-examples\mytbl.txt"
Enter password: ******
cookbook.mytbl: Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

C:\Users\lenovo>mysql -u cbuser -p
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 63
Server version: 8.0.40 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use cookbook
Database changed
mysql> select * from mytbl;
+------+------+
| col1 | col2 |
+------+------+
| abc  | def  |
| ghi  | jkl  |
| m n  | o p  |
| m"n  | o"p  |
+------+------+
4 rows in set (0.00 sec) 
成功的关键是:
正确设置了 字段分隔符(--fields-terminated-by=":"),匹配文件中的冒号分隔。
正确处理了 引号转义(--fields-optionally-enclosed-by="\"" 和 --fields-escaped-by="\""),解决了双引号的解析问题。
匹配了 Windows 系统的 行终止符(--lines-terminated-by="\r\n"),避免了空行和错位。
Windows 命令行的换行续符 ^ 需要放在每行末尾,且不能有多余的空格。

mysql> describe weatherdata;
+---------+-----------------------------------------------------------+------+-----+---------+-------+
| Field   | Type                                                      | Null | Key | Default | Extra |
+---------+-----------------------------------------------------------+------+-----+---------+-------+
| station | int unsigned                                              | NO   | PRI | NULL    |       |
| type    | enum('precip','temp','cloudiness','humidity','barometer') | NO   | PRI | NULL    |       |
| value   | float                                                     | YES  |     | NULL    |       |
+---------+-----------------------------------------------------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

执行命令
sql
TRUNCATE TABLE weatherdata;

执行后,表中的 15 条记录会被全部删除,且无法恢复(这一点和 DELETE FROM weatherdata; 不同,DELETE 可以通过事务回滚恢复,TRUNCATE 不行)。
3. 替代方案:DELETE
如果需要更灵活的删除(比如条件删除,或保留事务回滚的可能),可以用 DELETEsql
-- 删除所有数据(可以回滚,速度比 TRUNCATE 慢,适合小表)
DELETE FROM weatherdata;

 

两者的主要区别:

特性	TRUNCATE TABLE	DELETE FROM
速度	快(直接清空表,不记录日志)	慢(逐行删除,记录日志)
事务回滚	不可回滚(部分数据库支持,MySQL 中一般不可回滚)	可回滚(在事务中执行时)
自增计数器	重置	不重置
适用场景	彻底清空大表,无需恢复	条件删除或需要回滚的场景


C:\Users\lenovo>mysql -u cbuser -p --local-infile=1
Enter password: ******

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use cookbook;
Database changed
mysql> LOAD DATA LOCAL INFILE 'D:\\sql\\MySQL_cookbook\\mysqlcookbook-master\\recipes\\transfer\\load-examples\\data.txt'
    -> REPLACE INTO TABLE weatherdata
    -> FIELDS TERMINATED BY ','  -- 假设分隔符为逗号,根据实际情况修改(如'\t'表示制表符)
    -> LINES TERMINATED BY '\r\n'  -- Windows 换行符
    -> (station, type, value);  -- 明确指定字段顺序(需与文件列顺序一致)
Query OK, 15 rows affected (0.01 sec)
Records: 15  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from weatherdata;
+---------+------------+--------+
| station | type       | value  |
+---------+------------+--------+
|       1 | precip     |   10.5 |
|       1 | temp       |   25.3 |
|       1 | cloudiness |    0.7 |
|       1 | humidity   |   65.2 |
|       1 | barometer  | 1013.2 |
|       2 | precip     |    5.2 |
|       2 | temp       |   18.7 |
|       2 | cloudiness |    0.9 |
|       2 | humidity   |   72.5 |
|       2 | barometer  | 1008.5 |
|       3 | precip     |      0 |
|       3 | temp       |   32.1 |
|       3 | cloudiness |    0.2 |
|       3 | humidity   |     35 |
|       3 | barometer  | 1020.1 |
+---------+------------+--------+
15 rows in set (0.00 sec)

mysql> -- 先清空表
mysql> TRUNCATE TABLE mess_1;
Query OK, 0 rows affected (0.08 sec)

mysql>
mysql> -- 执行导入,将 @state_abbrev 原始值存入 st_abbrev
mysql> LOAD DATA LOCAL INFILE 'D:\\sql\\MySQL_cookbook\\mysqlcookbook-master\\recipes\\transfer\\load-examples\\datamess.txt'
    -> INTO TABLE mess_1
    -> IGNORE 1 LINES
    -> (@date, @time, @name, @weight_lb, @state_abbrev)
    -> SET
    ->   dt = CONCAT(@date, ' ', @time),
    ->   first_name = SUBSTRING_INDEX(@name, ' ', 1),
    ->   last_name = SUBSTRING_INDEX(@name, ' ', -1),
    ->   weight_kg = @weight_lb * 0.454,
    ->   st_abbrev = @state_abbrev;  -- 直接存入原始值,不查询 states 表
Query OK, 9 rows affected, 18 warnings (0.01 sec)
Records: 9  Deleted: 0  Skipped: 0  Warnings: 18

mysql>
mysql> -- 查看原始州缩写值
mysql> SELECT
    ->   CONCAT(first_name, ' ', last_name) AS full_name,
    ->   st_abbrev AS original_state_abbrev,
    ->   (SELECT name FROM states WHERE UPPER(TRIM(abbrev)) = UPPER(TRIM(st_abbrev))) AS matched_state_name
    -> FROM mess_1;
+-------------------+-----------------------+--------------------+
| full_name         | original_state_abbrev | matched_state_name |
+-------------------+-----------------------+--------------------+
| Mary Mary         | CA                    | California         |
| David David       | TX                    | Texas              |
| Emily Emily       | FL                    | Florida            |
| Michael Michael   | IL                    | Illinois           |
| Sarah Sarah       | PA                    | Pennsylvania       |
| James James       | OH                    | Ohio               |
| Lisa Lisa         | MX                    | NULL               |
| Robert Robert     | WA                    | Washington         |
| Patricia Patricia | CO                    | Colorado           |
+-------------------+-----------------------+--------------------+
9 rows in set (0.00 sec)

mysql> select * from mess_1;
+---------------------+-----------+------------+-----------+-----------+
| dt                  | last_name | first_name | weight_kg | st_abbrev |
+---------------------+-----------+------------+-----------+-----------+
| 2023-02-20 14:15:00 | Mary      | Mary       |   25.5148 | CA        |
| 2023-03-05 09:45:00 | David     | David      |   31.6892 | TX        |
| 2023-04-10 16:20:00 | Emily     | Emily      |   28.2842 | FL        |
| 2023-05-18 11:00:00 | Michael   | Michael    |   37.2734 | IL        |
| 2023-06-22 13:30:00 | Sarah     | Sarah      |   27.1038 | PA        |
| 2023-07-08 07:50:00 | James     | James      |   34.2316 | OH        |
| 2023-08-15 15:10:00 | Lisa      | Lisa       |   29.4646 | MX        |
| 2023-09-30 10:25:00 | Robert    | Robert     |   36.4108 | WA        |
| 2023-10-05 17:40:00 | Patricia  | Patricia   |   26.6044 | CO        |
+---------------------+-----------+------------+-----------+-----------+
9 rows in set (0.00 sec)

11.2 导入CSV文件 401

在mysql中导入csv文件。

       在数据库中输入如下命令: 

Mysql>load data infile "文件路径\X.csv"
into table table-name 
/*如果csv文件包含中文,添加"character set gb2313"*/
fields terminated by ',' optionally enclosed by '"' escaped by '"'
lines terminated by '\r\n'
注:出现过所有数据进入同一列的情况,上述代码去掉最后一行,导入正常了。

11.3 导出MYSQL的查询结果

mysql> SHOW VARIABLES LIKE 'secure_file_priv';
+------------------+---------------------------------+
| Variable_name    | Value                           |
+------------------+---------------------------------+
| secure_file_priv | D:\software\MySql\Data\Uploads\ |
+------------------+---------------------------------+
1 row in set, 1 warning (0.02 sec)

mysql> SELECT * FROM passwd
    -> INTO OUTFILE 'D:/software/MySql/Data/Uploads/passwd.txt'  -- 使用 MySQL 允许的路径
    -> FIELDS TERMINATED BY '\t'  -- 可选:指定字段分隔符(如制表符)
    -> LINES TERMINATED BY '\r\n';  -- Windows 换行符
Query OK, 58 rows affected (0.01 sec)

当你以 root 身份执行这个命令时:

bash
mysql -u root -p -e "select account, shell from passwd" --skip-column-names cookbook > shells.txt
生成的 shells.txt 文件会保存在 当前命令行的工作目录 下。 C:\Users\lenovo> 
 
如果需要指定保存到其他目录(如桌面),可以在文件名前加上完整路径,例如:
bash
mysql -u root -p -e "select account, shell from passwd" --skip-column-names cookbook > "C:\Users\lenovo\Desktop\shells.txt

C:\Users\lenovo>mysql --skip-column-names -e "SELECT * FROM city" -u cbuser -p cookbook
Enter password: ******
+----------------+----------------+----------------+
|        Alabama | Montgomery     | Birmingham     |
|         Alaska | Juneau         | Anchorage      |
|        Arizona | Phoenix        | Phoenix        |
|       Arkansas | Little Rock    | Little Rock    |
|     California | Sacramento     | Los Angeles    |
|       Colorado | Denver         | Denver         |
|    Connecticut | Hartford       | Bridgeport     |
|       Delaware | Dover          | Wilmington     |
|        Florida | Tallahassee    | Jacksonville   |
|        Georgia | Atlanta        | Atlanta        |
|         Hawaii | Honolulu       | Honolulu       |
|          Idaho | Boise          | Boise          |
|       Illinois | Springfield    | Chicago        |
|        Indiana | Indianapolis   | Indianapolis   |
|           Iowa | Des Moines     | Des Moines     |
|         Kansas | Topeka         | Wichita        |
|       Kentucky | Frankfort      | Louisville     |
|      Louisiana | Baton Rouge    | New Orleans    |
|          Maine | Augusta        | Portland       |
|       Maryland | Annapolis      | Baltimore      |
|  Massachusetts | Boston         | Boston         |
|       Michigan | Lansing        | Detroit        |
|      Minnesota | St. Paul       | Minneapolis    |
|    Mississippi | Jackson        | Jackson        |
|       Missouri | Jefferson City | Kansas City    |
|        Montana | Helena         | Billings       |
|       Nebraska | Lincoln        | Omaha          |
|         Nevada | Carson City    | Las Vegas      |
|  New Hampshire | Concord        | Manchester     |
|     New Jersey | Trenton        | Newark         |
|     New Mexico | Santa Fe       | Albuquerque    |
|       New York | Albany         | New York City  |
| North Carolina | Raleigh        | Charlotte      |
|   North Dakota | Bismarck       | Fargo          |
|           Ohio | Columbus       | Columbus       |
|       Oklahoma | Oklahoma City  | Oklahoma City  |
|         Oregon | Salem          | Portland       |
|   Pennsylvania | Harrisburg     | Philadelphia   |
|   Rhode Island | Providence     | Providence     |
| South Carolina | Columbia       | Columbia       |
|   South Dakota | Pierre         | Sioux Falls    |
|      Tennessee | Nashville      | Memphis        |
|          Texas | Austin         | Houston        |
|           Utah | Salt Lake City | Salt Lake City |
|        Vermont | Montpelier     | Burlington     |
|       Virginia | Richmond       | Virginia Beach |
|     Washington | Olympia        | Seattle        |
|  West Virginia | Charleston     | Charleston     |
|      Wisconsin | Madison        | Milwaukee      |
|        Wyoming | Cheyenne       | Cheyenne       |
+----------------+----------------+----------------+

打开 PowerShell(按下 Win + X 选择 “Windows PowerShell”),执行以下命令:
PS C:\Users\lenovo> mysql -u cbuser -p -N -e "SELECT * FROM city" cookbook | ForEach-Object { $_ -replace "`t", '#' } > "C:\Users\lenovo\city.txt"
Enter password: ******
PS C:\Users\lenovo>
命令解释
mysql -u cbuser -p -N -e "SELECT * FROM city" cookbook:
-N 等价于 --skip-column-names,不显示列名。
执行查询并输出结果(默认用制表符 Tab 分隔字段)。
ForEach-Object { $_ -replace "t", '#' }`:
PowerShell 的文本替换功能,将制表符 Tab(\t 在 PowerShell 中用 `t 表示)替换为 #。
> "C:\Users\lenovo\city.txt":
将处理后的结果保存到 city.txt,文件位于 C:\Users\lenovo\ 目录(即你的用户主目录)。

网站公告

今日签到

点亮在社区的每一天
去签到