2014-01-31 69 views
1

希望我能解释这不够好......我有一个表叫artists基本上与2列,artist_pk(主键)和artist_name。我使用LOAD DATA INFILEartist_name列的记录通过CSV文件导入表artists,并让MySQL提供artist_pk值。这一切都完成了。LOAD DATA INFILE - 拼命卡住

现在我想为我的表导入数据(通过相同的导入方法),名为albums。这里的三个相关列album_pk(主),album_nameartist_pk(从artists表的外键)。再次,我将让mySQL分配album_pk值。

在我的CSV数据中有album_name和artist_name。我没有artist_pk值。所以我的问题是:我可以导入artist_name CSV列作为我的tables导入的一部分,但不是按原样使用它,请指示mySQL使用artists表中的关联artist_pk PRIMARY KEY值?

例如在artists表中的记录:

artist_pk | artist_name | 
+-----------+--------------+ 
|  1 | Depeche Mode | 
+-----------+--------------+ 

现在从我的CSV文件(即我希望把我的albums表)的摘录。

album_name artist_name 
Violator Depeche Mode 

'违规者'将填充albums.album_name。但为了填充albums.artist_pk,我希望MySQL使用'Depeche Mode'(位于artists.artist_name)去获得其相关值artist_pk(本例中为1) - 这是表albums中的值。

在此先感谢!

+0

如果你的名字是保证是独一无二的,你可以做到。否则,你需要另一种方法。 –

+0

与您的问题无关,但当专辑中有多位艺术家时会发生什么? –

+0

@Dan Bracuk谢谢丹,但我卡在方法 - 这是我的问题?如何在执行LOAD DATA INFILE操作时使用artist_name访问artist_pk?重申:你的第二个评论 - 合作将是他们自己的艺术家(例如Christabelle&Lindstrom,他们都是独唱艺人),但汇编将以不同的方式处理 - 我相信这就是为什么iTunes(例如)拥有Artist和专辑艺术家。但是其中一些可以稍后决定......这整个音乐数据库对我来说是学习MySQL的方式的一个有趣的练习! – simien

回答

2

假设artists表已经填充您可以利用会话变量和SET子句中LOAD DATA INFILE载入您的数据

做必要的查询
LOAD DATA INFILE '/path/to/albums.txt' 
INTO TABLE albums 
FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 LINES 
(album_name, @artist_name) -- use a session variable to store a value read from the file 
SET artist_pk = 
(
    SELECT artist_pk 
    FROM artists 
    WHERE artist_name = @artist_name -- use a session variable to get an artist_pk 
    LIMIT 1 -- this is to ensure that only one row will be returned 
) 

让我们尝试一下

 
mysql> CREATE TABLE artists (`artist_pk` int not null auto_increment primary key, `artist_name` varchar(12)); 
Query OK, 0 rows affected (0.07 sec) 

mysql> INSERT INTO artists (`artist_name`) VALUES ('Depeche Mode'); 
Query OK, 1 row affected (0.00 sec) 

mysql> CREATE TABLE albums (`album_pk` int not null auto_increment primary key, album_name varchar(255), artist_pk int, foreign key (artist_pk) references artists(artist_pk)); 
Query OK, 0 rows affected (0.03 sec) 

mysql> LOAD DATA INFILE '/tmp/albums.txt' 
    -> INTO TABLE albums 
    -> FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' 
    -> LINES TERMINATED BY '\n' 
    -> IGNORE 1 LINES 
    -> (album_name, @artist_name) 
    -> SET artist_pk = 
    -> (
    -> SELECT artist_pk 
    ->  FROM artists 
    -> WHERE artist_name = @artist_name 
    ->); 
Query OK, 1 row affected (0.01 sec) 
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0 

mysql> select * from albums;                      
+----------+------------+-----------+ 
| album_pk | album_name | artist_pk | 
+----------+------------+-----------+ 
|  1 | Violator |   1 | 
+----------+------------+-----------+ 
1 row in set (0.00 sec) 
+0

谢谢你,我几乎在那里,但语法错了。但有一件事......我把artist_name作为'albums'上的外键,但是我必须在SQL允许'SET'之前删除它。这是人们所期望的吗? – simien