2013-08-01 12 views
12

Voglio creare uno script bash che si colleghi al mio server MySQL e inserisca qualche valore da un file txt. ho scritto questo in giù:Script di Bash per inserire valori in MySQL

#!/bin/bash 
echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('cat test.txt');" | mysql -uroot -ptest test; 

ma sto riceve il seguente errore:

ERROR 1136 (21S01) at line 1: Column count doesn't match value count at row 1

Suppongo che l'errore è nel mio file txt, ma ho provato molte variazioni e ancora nessun speranza di successo.

mio file txt si presenta così:

10.16.54.29 00:f8:e5:33:22:3f marsara

risposta

8

Supponendo di avere molte righe da aggiungere, probabilmente avete bisogno LOAD DATA INFILE un'affermazione, non INSERT. Il file sorgente deve essere sul server, ma sembra che sia il caso qui.

Qualcosa del genere:

#!/bin/bash 

mysql -uroot -ptest test << EOF 

LOAD DATA INFILE 'test.txt' 
    INTO TABLE tbl_name 
    FIELDS TERMINATED BY ' '; 

EOF 

LOAD DATA INFILE ha molte opzioni, come potrete scoprire leggendo il doc.

5

Si sta tentando di inserire il valore "cat test.txt" come stringa nel database in un'istruzione INSERT che richiede 3 parametri (IP, MAC e SERVER), ecco perché si ottiene questo messaggio di errore.

è necessario leggere il file di testo prima e estrarre i valori Server IP, MAC e quindi utilizzare questi nella query che sarebbe simile a questa, una volta riempita:

#!/bin/bash 
echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('10.16.54.29', '00:f8:e5:33:22:3f', 'marsara');" | mysql -uroot -ptest test; 
19

provare questo:

#!/bin/bash 
inputfile="test.txt" 
cat $inputfile | while read ip mac server; do 
    echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('$ip', '$mac', '$server');" 
done | mysql -uroot -ptest test; 

In questo modo lo streaming del file ha letto anche l'esecuzione del comando mysql.

+1

Grazie ... questa era una buona soluzione! – user2642601

+0

Anche questo ha funzionato per me, grazie –

2

Io uso questa e funziona:

mysql -uroot -proot < infile 

o selezionare il database prima

./mysql -uroot -proot db_name < infile 

o copiare l'intero SQL negli Appunti e incollarlo con

pbpaste > temp_infile && mysql -uroot -proot < temp_infile && rm temp_infile