Napsal jsem si skriptík, který z textového souboru načítá jednotlivé řádky a následně je zpracuje a uloží do databáze. Vše by bylo pěkné, kdyby v onom skriptu nebyla chyba, kvůli které nebyly některé řádky zpracované. Vzhledem k tomu, že zpracovávání všech údajů zabralo pár hodin, tak opětovné spuštění skriptu na všechna data nepřipadalo v úvahu. Bylo třeba zjistit, které záznamy byly zpracovány a které ne. Po chvilce hledání jsem usoudil, že jedním (byť složeným) dotazem to nezjistím. Byly potřeba tři.

Pro demonstraci použiji jen pár záznamů, aby byl vidět výsledek.

V souboru data.txt jsou tyto údaje: dum auto zidle vana skrin stul dvere podlaha okno strecha balkon. Každé slovo na novém řádku.
Do tabulky se uložily údaje o některých těchto slovech:

MySQL:
mysql> SELECT * FROM data;
+----+---------+
| id | slovo   |
+----+---------+
1 | dum     |
2 | auto    |
3 | zidle   |
4 | stul    |
5 | dvere   |
6 | okno    |
7 | strecha |
+----+---------+
7 rows in SET (0.00 sec)

Teoretické řešení je jednoduché. Porovnat zdrojový soubor s daty a vypsat všechny řádky, které nejsou obsaženy v tabulce data. Praktické řešení pokulhává na tom, že jsem nenašel způsob, jak načíst data z textového souboru a přímo s nimi pracovat. I bez toho je však řešení celkem jednoduché.

Nejdříve si vytvořím dočasnou tabulku. Do té načtu obsah datového souboru a nakonec jen porovnám záznamy v tabulce data s daty v dočasné tabulce.

MySQL:
mysql> CREATE TEMPORARY TABLE t (s VARCHAR(100));
Query OK, 0 rows affected (0.00 sec)

mysql> LOAD DATA INFILE '/tmp/data.txt' INTO TABLE t;
Query OK, 11 rows affected (0.00 sec)
Records: 11  Deleted: 0  Skipped: 0  WARNINGS: 0

mysql> SELECT t.s FROM t
    -> WHERE s NOT IN (SELECT slovo FROM data);
+---------+
| s       |
+---------+
| vana    |
| skrin   |
| podlaha |
| balkon  |
+---------+
4 rows in SET (0.06 sec)

Abych mohl výstup použít pro další zpracování, je vhodné jej uložit zpátky do textového souboru.

MySQL:
mysql> SELECT t.s INTO OUTFILE '/tmp/vystup.txt'
    -> FROM t
    -> WHERE s NOT IN
    -> (SELECT slovo FROM data);
Query OK, 4 rows affected (0.00 sec)

Obsah souboru vystup.txt:

CODE:
[WA@Eleanor tmp]$ cat vystup.txt
vana
skrin
podlaha
balkon

Může se stát, že vám MySQL vypíše chybu:
ERROR 1 (HY000): Can't create/write to file 'xzy.tx' (Errcode: 13)
V tom případě použijte adresář, do kterého může mysql zapisovat. V linuxu například /tmp.

Na závěr neuškodí, dočasnou tabulku smazat.

MySQL:
mysql> DROP TABLE t;
Query OK, 0 rows affected (0.00 sec)