# Einzelne Spalte in MySQL-DB-Tabelle schreiben



## nogod (8. Okt 2011)

Hallo,

wie kann ich eine einzelne Spalte und ihre Datensätze von einem Textfile in eine Tabelle schreiben? Die Tutorials, die ich fand, schreiben alle Datensätze rein, aber das möchte ich ja nicht.

Die Spalten des Textfiles sehen so aus, wovon ich lediglich die Spalte _Nummer_ benötige:

Typ;Datum;Zeit;Version;Nummer;Angebot;Nachfrage;Preis;Verkaufspreis;Absatz;Prognose;Ort;Land

Wie mache ich das? Meine Datenbank heißt Cust und die Tabelle heißt CustNo1. 

Danke euch.


----------



## Final_Striker (8. Okt 2011)

Mit 
	
	
	
	





```
INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);
```
?

MySQL :: MySQL 5.1 Referenzhandbuch :: 13.2.4 INSERT


----------



## nogod (9. Okt 2011)

Das funktioniert leider doch nicht so, wie ich mir das vorgestellt hatte..

Konkret sieht meine Datei so aus: 

Nummer.dat


```
Typ;Datum;Zeit;Version;Nummer;Angebot;Nachfrage;Preis;Verkaufspreis;Absatz;Prognose;Ort;Land
A;01.10.2011;10:00:05,010;     ;3228.5;288;0;0;0;0;;;0
A;01.10.2011;10:00:05,520;     ;3134.5;1;0;0;0;0;;;0
A;01.10.2011;10:00:05,520;     ;3357;22;0;0;0;0;;;0
A;01.10.2011;10:00:05,520;     ;3643.5;4;0;0;0;0;;;0
A;01.10.2011;10:00:05,520;     ;3546;11;0;0;0;0;;;0
```

Hat vielleicht jemand ein Minimalbeispiel wie ich mit Java dieses Textfile als Tabelle in meiner Datenbank so wie sie ist anlegen kann? 

Ich hab zwar einiges versucht, aber es nicht hinbekommen.


----------



## Marcinek (9. Okt 2011)

Als CSV DAtei importieren?


----------



## nogod (9. Okt 2011)

Deinen Tipp verstehe ich nicht und er bringt mir auch im Endeffekt nichts, da ich nach einem Minimalbeispiel fragte. 

Das ist das, was ich versucht habe: 


```
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;

@SuppressWarnings("unused")
public class AutomateImport
{
    public static void main(String[] args) 
    {
        DBase db = new DBase();
        Connection conn = db.connect(
    "jdbc:mysql://localhost:3306/nummer","root","root");
        db.importData(conn,"Nummer.dat");
    }

}

class DBase
{
    public DBase()
    {
    }

    public Connection connect(String db_connect_str, 
  String db_userid, String db_password)
    {
        Connection conn;
        try 
        {
            Class.forName(  
    "com.mysql.jdbc.Driver").newInstance();

            conn = DriverManager.getConnection(db_connect_str, 
    db_userid, db_password);
        
        }
        catch(Exception e)
        {
            e.printStackTrace();
            conn = null;
        }

        return conn;    
    }
    
    public void importData(Connection conn,String filename)
    {
        Statement stmt;
        String query;

        try
        {
            stmt = conn.createStatement(
    ResultSet.TYPE_SCROLL_SENSITIVE,
    ResultSet.CONCUR_UPDATABLE);

            query = "LOAD DATA INFILE '"+filename+
    "' INTO TABLE  (Typ,Datum,Zeit,Version,Nummer,Angebot,Nachfrage,Preis,Verkaufspreis,Absatz,Prognose,Ort,Land);";

            stmt.executeUpdate(query);
                
        }
        catch(Exception e)
        {
            e.printStackTrace();
            stmt = null;
        }
    }
};
```


Ich bekomme allerdings folgende Exception:

```
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'typ' at row 1
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3564)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2562)
	at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1664)
	at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1583)
	at com.tm3.forecast.show.DBase.importData(AutomateImport.java:65)
	at com.tm3.forecast.show.AutomateImport.main(AutomateImport.java:17)
```

Außerdem ist es nicht genau das, was ich möchte. Ich möchte ja eben die Tabelle dynamisch aus dem .dat-File heraus erzeugen.

Wenn ich Dutzende solcher Files habe, dann ist es unsinnig jedesmal per Hand Tabellen in meiner Datenbank zu erzeugen. Kann mir jemand vielleicht helfen dies zu automatisieren?


----------



## Marcinek (9. Okt 2011)

Kettle von Penthaho kann das automatisieren.

Ansonsten hat deine erste spalte einen Wert der über den Wertebereich der Spalte in der Tabelle geht.

Beispiel: Du hast boolean (1/0) und du versuchst 2 einzutragen.

Gruß,

Martin


----------



## Deros (10. Okt 2011)

zum einen würde ich es mit "IGNORE 1 LINES" in deinem statement versuchen, damit er die erste zeile nicht versucht in die spalten zu quetschen. ausserdem glaube ich nicht das er im standard nach semikolon seperiert, das solltest du ihm vielleicht auch mitteilen. aber google ist dein freund, einfach mal den "LOAD DATA INFILE"-Befehlt vielleicht etwas genauer angucken


----------



## Jigga (10. Okt 2011)

was *Marcinek * mit seinem kommentar meinte:
du liest deine textdatei mit einer schleife zeilenweise ein.
jede zeile repräsentiert dabei einen deiner DB-Eintrag. daraus kannst du dir Objekte erstellen und mit diesen weiterarbeiten.
ansonsten, um nicht alle daten einzulesen sondern nur die spalte nummer, einfach nur bis zum gewünschten wert lesen und dann nächste zeile aufrufen.


----------

