我正在努力学习如何有效地使用mysql。现在,我想在一个mysql数据库中加载一个包含作者参考书目的csv。这是我生成数据库并尝试上传文件的代码:
USE stephenkingbooks;
DROP TABLE IF EXISTS stephenkingbooks;
CREATE TABLE stephenkingbooks
(
`id` int unsigned NOT NULL auto_increment,
`original_title` varchar(255) NOT NULL,
`spanish_title` varchar(255) NOT NULL,
`year` decimal(4) NOT NULL,
`pages` decimal(10) NOT NULL,
`in_collection` enum('Y','N') NOT NULL DEFAULT 'N',
`read` enum('Y','N') NOT NULL DEFAULT 'N',
PRIMARY KEY (id)
);
LOAD DATA LOCAL INFILE '../files/unprocessed_sking.csv'
INTO TABLE stephenkingbooks (column1, column2, column4, column3)
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 ROWS;
csv文件的格式如下:
Carrie,Carrie,Terror,199,19745,"En 1976, el director de cine Brian de Palma hizo la primera película basada en la novela.7 3"
我的想法是只加载对应于original_title的两个第一列,第二列是西班牙语标题(在mysql和csv中相同),在csv中的column3之后是pages
和column4 year
。
此外,对于年份栏目,我只想获取该字段的4个第一个数字,因为我有一些参考不属于年份。例如,Carrie于1974年被释放,但csv在我不想考虑的日期包括5个。
我的问题是我无法在我的终端中没有错误地获得我想要的东西......有什么建议吗?
答案 0 :(得分:1)
13.2.6 LOAD DATA INFILE Syntax
...
如果中的字段顺序,您还必须指定列列表 输入文件与表中列的顺序不同。
...
尝试:
mysql> LOAD DATA INFILE '../files/unprocessed_sking.csv'
-> INTO TABLE `stephenkingbooks`
-> FIELDS TERMINATED BY ','
-> ENCLOSED BY '"'
-> LINES TERMINATED BY '\r\n'
-> (`original_title`, `spanish_title`, @`genre`, @`pages`, @`year`)
-> SET `year` = LEFT(@`year`, 4), `pages` = @`pages`;
Query OK, 1 row affected (0.00 sec)
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
mysql> SELECT
-> `id`,
-> `original_title`,
-> `spanish_title`,
-> `year`,
-> `pages`,
-> `in_collection`,
-> `read`
-> FROM `stephenkingbooks`;
+----+----------------+---------------+------+-------+---------------+------+
| id | original_title | spanish_title | year | pages | in_collection | read |
+----+----------------+---------------+------+-------+---------------+------+
| 1 | Carrie | Carrie | 1974 | 199 | N | N |
+----+----------------+---------------+------+-------+---------------+------+
1 row in set (0.00 sec)