2014-01-31 99 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