Eehehehe, pa lijepo sam napisao da provjeris da li rade ta rjesenja, jer sam ih pisao iz glave, dakle bez testiranja...
No, da ne kazes kako sam ti dao besmislene hintove, evo ti kompletan primjer u stilu Toma Kytea...
Za ovaj primjer sam kreirao glavnu tabelu "rijeci" i dvije privremene tabele radi prikaza funkcionisanja LOAD DATA...
Code:
C:\Dokumente und Einstellungen\Dejan>mysql -u dejan -p dejan
Enter password: *****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 5.0.24-community-nt-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> CREATE TABLE rijeci(
-> rijec VARCHAR(30) NOT NULL,
-> fajl VARCHAR(30),
-> PRIMARY KEY(rijec));
Query OK, 0 rows affected (0.47 sec)
mysql> DESCRIBE rijeci;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| rijec | varchar(30) | NO | PRI | | |
| fajl | varchar(30) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> CREATE TABLE privremena AS SELECT * FROM rijeci WHERE 0=1;
Query OK, 0 rows affected (0.53 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESCRIBE privremena;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| rijec | varchar(30) | NO | | | |
| fajl | varchar(30) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> CREATE TABLE privremena2 AS SELECT * FROM rijeci WHERE 0=1;
Query OK, 0 rows affected (0.53 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESCRIBE privremena2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| rijec | varchar(30) | NO | | | |
| fajl | varchar(30) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> ALTER TABLE privremena2 ADD CONSTRAINT PRIMARY KEY(rijec);
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESCRIBE privremena2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| rijec | varchar(30) | NO | PRI | | |
| fajl | varchar(30) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
Uoci razliku u koloni 'Key' za tabele 'privremena' i 'privremena2'. Kasnije ces opaziti djelovanje PRIMARY kljuca.
Napravimo fajl "rijec.txt" u glavnom C: direktorijumu (C:\rijec.txt) i to sa slijedecim sadrzajem:
Code:
rijec1 fajl1
rijec2 fajl2
rijec1 fajl2
rijec2 fajl2
rijec3 fajl2
rijec4 fajl2
rijec5 fajl2
rijec1 fajl3
rijec2 fajl3
rijec1 fajl4
Napomena: Da bi koristio LOAD DATA INFILE, moras kao root zeljenom korisniku dodijeliti FILE privilegiju (kod mene je verzija 5.0.24):
Code:
mysql> GRANT FILE ON *.* TO dejan@localhost;
Ubacimo sadrzaj tog fajla u tabelu 'privremena2' (privremena tabela sa PRIMARY kljucem):
Code:
mysql> LOAD DATA INFILE 'c:/rijec.txt' INTO TABLE privremena2 FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n';
ERROR 1062 (23000): Duplicate entry 'rijec1' for key 1
mysql> select * from privremena2;
+--------+-------+
| rijec | fajl |
+--------+-------+
| rijec1 | fajl1 |
| rijec2 | fajl2 |
+--------+-------+
2 rows in set (0.00 sec)
Primijetices da zbog primarnog kljuca dolazi do prijavljivanja greske i da se unos prekida. Dakle, nemoguce je jednu rijec dvaput upisati u tabelu.
Sad ubacimo sadrzaj fajla u tabelu 'privremena' (privremena tabela bez PRIMARY kljuca):
Code:
mysql> LOAD DATA INFILE 'c:/rijec.txt' INTO TABLE privremena FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n';
Query OK, 10 rows affected (0.00 sec)
Records: 10 Deleted: 0 Skipped: 0 Warnings: 0
mysql> SELECT * FROM privremena;
+--------+-------+
| rijec | fajl |
+--------+-------+
| rijec1 | fajl1 |
| rijec2 | fajl2 |
| rijec1 | fajl2 |
| rijec2 | fajl2 |
| rijec3 | fajl2 |
| rijec4 | fajl2 |
| rijec5 | fajl2 |
| rijec1 | fajl3 |
| rijec2 | fajl3 |
| rijec1 | fajl4 |
+--------+-------+
10 rows in set (0.00 sec)
Svi redovi iz fajla su ubaceni u tabelu.
Sad nam samo preostaje da iz te privremene tabele prebacimo sadrzaj u glavnu tabelu 'rijeci':
Code:
mysql> INSERT INTO rijeci
-> SELECT * FROM privremena
-> ON DUPLICATE KEY UPDATE rijeci.fajl = CONCAT(rijeci.fajl, ' ', privremena.fajl);
Query OK, 10 rows affected (0.00 sec)
Records: 10 Duplicates: 5 Warnings: 0
mysql> SELECT * FROM rijeci;
+--------+-------------------------+
| rijec | fajl |
+--------+-------------------------+
| rijec1 | fajl1 fajl2 fajl3 fajl4 |
| rijec2 | fajl2 fajl2 fajl3 |
| rijec3 | fajl2 |
| rijec4 | fajl2 |
| rijec5 | fajl2 |
+--------+-------------------------+
5 rows in set (0.00 sec)
I nakon toga obrisemo sadrzaj privremene tabele (samo ukoliko ne koristis TEMPORARY tabelu):
Code:
mysql> DELETE FROM privremena;
Query OK, 10 rows affected (0.02 sec)
Vidis kako divno funkcionise? :)
Ali opet, rjesenje sa odvojenim tabelama je po meni daleko bolje, nego ovako da radis...
Edit: Previdio sam mogucnost, da se u nekom fajlu ponovi kombinacija rijeci i fajla, pa bi onda za jednu rijec naziv fajla mogao biti ponovljen vise puta...npr. 'rijec1 fajl1 fajl2 fajl1 fajl3 fajl4 fajl2'. Da bi se to sprijecilo, potrebno je onda staviti PRIMARY KEY na obe kolone rijec i fajl u tabeli privremena, te izmijeniti LOAD DATA izraz da bude:
Code:
mysql> LOAD DATA INFILE 'c:/rijec.txt' IGNORE INTO TABLE privremena FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n';
Pri ovom uslovu, tabela 'privremena' ne smije biti na kraju ispraznjena sa 'DELETE FROM privremena'.
Blog - baze podataka
---------------------
Oracle OCP DBA (9i & 10g)
Oracle Database: SQL Certified Expert
Oracle OCP Developer
Certified MySQL DBA