2012-03-29 13 views
1

私は次のように入力ファイルを使用している場合:MySQL複数のテーブルに正しく挿入する方法を教えてください。

US, P1, AgriZone, H, 1000, 1200, 1101, 1210 
US, P2, ArgiZone, L, 120, 122, 345, 566 
MX, Q4, FarmOne, H, 1120, 2200, 1111, 2345 

そして私は、次の表を持っています。

Tables In SQLFiddle

私の問題:どのように私は(1行を考慮すると、複数のテーブルに該当)DBに正しくこれらのレコードを挿入するのですか?ユニークな表の列を追加するにはどうすればよいですか?例AgrizoneはテーブルFarmに1つのエントリだけ必要ですか?これを挿入するときの典型的なアプローチは何ですか?

try 
     { 
     Class.forName("com.mysql.jdbc.Driver"); 
     Connection con = (Connection) DriverManager.getConnection(
      "jdbc:mysql://" + this.getServer() + "/" + this.getDatabase(), 
      user, password); 

     Statement s1 = (Statement) con.createStatement(); 
     s1.executeUpdate("INSERT INTO" ??); 

     con.close(); 

     } 
    Catch(Exception blah) 

このタイプの挿入を管理するには、PKとFKが正しく設定されていることを確認してください。

ありがとうございました。

+0

あなたはユニークに列を制限しようとしたのですか?重複(更新または無視)の場合の対処方法を決定できます – Ibu

答えて

1

はUNIQUE(それは「Argizone」が2回挿入するためにpossibileない)

  • テーブルごとにリンクする外部キーを使用するべきである農業の表に例FARM_TITLEについてあなたのDBテーブル

    • 上の制約を実装してください。その他。これはあなたのようなファイルの行を再構築できるようになることをgurantees:US、P1、複数の表に "分割さ" されているAgriZone、H、1000年、1200年、1101年、1210

    - 使用トランザクション:多くのテーブルでより多くのinsert文を実行できます。挿入に失敗した場合は、ファイルの行を持っていないように、「部分的に」デシベルに挿入されたトランザクションをロールバック:

    try{ 
        con.setAutoCommit(false); 
        //do the multiple queries 
    
        con.commit() 
    } 
    catch(Exception e) { 
        con.rollback(); 
    } 
    

    行のSQL挿入で擬似コード:米国、P1、AgriZone 、H、1000年、1200年、1101年、1210

    は、最初の原点を挿入ので、米国はテーブルの起源ではない、まだ起源されているとです:

    //this is pseudo code that insert into db table and retreive the id inserted. ID shoul be primary key and autoincrement 
    int origin_id = execute(INSERT INTO ORIGIN(ORIGIN_NAME) values ("US"); 
    
    //now we insert the P1 stock. Again STOCK_ID primary key auto inc 
    int stock_id = execute(INSERT INTO STOCK(ORIGIN_ID, STOCK_TITLE) values (origin_id, "P1"); 
    
    //now fill table FARM 
    int farm_id = execute (INSERT INTO FARM(STOCK_ID, FARM_TITLE, SIZE, FARM_COMPNENTS) values (stock_id,"Agrizone","H","100"); 
    
    //finally a cycle to insert in GATE suppose we have n entries in this case (1200, 1101, 1210). I image to have an array 
    for(int i =0; i<n; i++) 
        INSERT INTO GATE (FARM_ID, FARM_COMPONENTS) values (farm_id,value[i]); 
    
  • +0

    入力ファイルの最初の行に挿入を設定する方法の例を提供できますか(データベースを修正してユニークを作成することを考慮して) – stackoverflow

    +1

    もちろん、私はファイルの行構造を完全に理解する必要があります。例:US、P1、AgriZone、H、1000,1200,1101,1210。ファイルフィールドとdbテーブルとの間の対応は? –

    +0

    Okファイル入力の各行は、表現されたOrigin全体です。構造はORIGIN、STOCK、FARM、SIZE、VALUE(1)、VALUE(2).... VALUE(n)です。表はhttp://sqlfiddle.com/#!2/b468bにあります。次の値はn個までです。しかし初期値(1)は 'Farm'に挿入され、残りの値は' GATE'テーブルに挿入されます – stackoverflow

    関連する問題