使用自增主键的mysql LOAD DATA INFILE

16

我正在尝试使用"LOAD DATA LOCAL INFILE 'filename' INTO TABLE 'tablename'"将数据文件加载到mysql表中。

问题在于源数据文件包含每个字段的数据,但缺少主键('id'列)。我在创建数据库时添加了一个唯一的id字段,但现在需要从下一个字段开始将数据导入表中,并在导入时自动递增id字段。

def create_table():
            cursor.execute ("""
                    CREATE TABLE variants
                    (
                    id integer(10) auto_increment primary key,
                    study_no CHAR(40),
                    other fields.....


                    )
                    """)

这是我的LOAD查询语句

query1= "LOAD DATA LOCAL INFILE '"+currentFile+"' INTO TABLE variants FIELDS TERMINATED BY '\\t' LINES TERMINATED BY '\\n'"

有什么想法吗?

概述: 创建一张表,并添加一个自动递增的id字段; 将20个字段的数据加载到该21个字段的表中,跳过id字段; 让id字段自动填充自动递增的索引。

5个回答

22

指定列清单:

默认情况下,在LOAD DATA INFILE语句的结尾未提供列清单时,输入行应包含每个表列的一个字段。如果您只想加载表中的某些列,请指定列清单:

LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);

http://dev.mysql.com/doc/refman/5.1/en/load-data.html


有没有一种简单的方法列出所有20个列名,类似于列表[1:]符号?还是我必须输入每个列名,例如study_no,family_no等? 谢谢 - biomed
列清单必须位于最后,id列必须设置为null以自动递增。 - biomed
1
为了添加列名,您应该能够执行以下操作:cursor.execute("DESCRIBE tablename"); query = "LOAD DATA INFILE 'data.txt' INTO TABLE tablename (%s)" % ', '.join([x[0] for x in cursor.fetchall()][1:]) - Aaron

3
LOAD DATA LOCAL INFILE '/var/www/.........../file.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\\r\\n' (field1,field2,.........,fieldn)

这是针对Ubuntu操作系统的情况。


2

您的数据文件应该像这样: null,学习字符,其他字段... MySQL将插入递增的ID而不是null


0

0

如果csv记录如下,请使用以下查询

"21231","234424","我的类别","1"

LOAD DATA LOCAL INFILE 'C:/wamp/www/cakephp/app/webroot/files/product_catalogs/categories.csv' INTO TABLE cats FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' (category_id,parent_id,category,is_leaf)

我已经成功完成了。 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接