2016-09-13 8 views
-1

動的列を持つテーブルに値を追加したいとします。 動的な列を持つテーブルを作成することができましたが、データを挿入する方法がわかりません。動的列を持つテーブルに値を挿入する方法Jdbc/Mysql

//Create Table 

sql = "CREATE TABLE MyDB.myTable" + 
     "(level INTEGER(255))"; 

     int columnNumber = 5; //Number of columns 

      //Add columns 

     for (i=0;i<columnNumber;i++){ 
       String columnName = "Level_" +i: 
       String sql = "ALTER TABLE MyDB.myTable ADD " + columnName + " INTEGER(30)"; 
    } 

//Insert Data 

//How to insert data dynamically, without knowing the number of columns? 
+0

なぜSQLを使用しますか?動的な列を持つテーブルを探しているなら、MongoDBのようなものを見たいかもしれません。 – verhie

答えて

2

for(i=0i<columnNumber;i++){ 
    "INSERT INTO _table (ID, Level, _Value) VALUES ("+ the_ID +", "+ i +", "+ the_VALUE +");"; 
} 

あなたがデータをフェッチします。これには、列名を知る必要がなく、コード内で動的に取得されるという利点もあります。

public static List<String> getColumns(String tableName, String schemaName) throws SQLException{ 

    ResultSet rs=null; 

    ResultSetMetaData rsmd=null; 
    PreparedStatement stmt=null; 
    List<String> columnNames =null; 
    String qualifiedName = (schemaName!=null&&!schemaName.isEmpty())?(schemaName+"."+tableName):tableName; 
    try{ 
     stmt=conn.prepareStatement("select * from "+qualifiedName+" where 0=1"); 
     rs=stmt.executeQuery();//you'll get an empty ResultSet but you'll still get the metadata 
     rsmd=rs.getMetaData(); 
     columnNames = new ArrayList<String>(); 
     for(int i=1;i<=rsmd.getColumnCount();i++) 
      columnNames.add(rsmd.getColumnLabel(i));  
    }catch(SQLException e){ 
     throw e;//or log it 
    } 
    finally{ 
     if(rs!=null) 
      try { 
       rs.close(); 
      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       throw e 
      } 
     if(stmt!=null) 
      try { 
       stmt.close(); 
      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       throw e 
      } 
    } 
    return columnNames; 
} 

あなたが列名を持っていたら、あなたは通常(はlist.size()もちろん列の数を与える)と同じように、あなたはそれを使用することができます。

UPDATE:

//I will assume that your values (data to be inserted) is a List of Object types and that it is already populated 



List<Object> data = new ArrayList<>(); 
    //you will populate this list 

    //getting the column names 
    List<String> columnNames = getColumns("MyTable", "MyDB"); 

    String insertColumns = ""; 
    String insertValues = ""; 

    if(columnNames != null && columnNames.size() > 0){ 
     insertColumns += columnNames.get(0); 
     insertValues += "?"; 
    } 


    for(int i = 1; i < columnNames.size();i++){ 
     insertColumns += ", " + columnNames.get(i) ; 
     insertValues += "?"; 
    } 

    String insertSql = "INSERT INTO MyDB.MyTable (" + insertColumns + ") values(" + insertValues + ")"; 

    try{ 
    PrepareStatement ps = conn.prepareStatement(insertSql); 

    for(Object o : data){ 
    ps.setObject(o); //you must pass objects of correct type 
    } 
    ps.execute(); //this inserts your data 
    }catch(SQLException sqle){ 
     //do something with it 
    } 

このコードは、あなたががPreparedStatement.setObject(オブジェクトo)メソッドに正しい型のオブジェクトを渡すことを想定しています。メタデータ情報を使用して列の型を取得し、その情報を使用して型チェックを実施することもできますが、コードをもっと複雑にします。

+0

ありがとうございます。しかし、列の数を取得した後、特定のテーブルにデータを挿入するにはどうしたらいいですか? – TedNugent

+0

私は自分の答えを更新しました。 –

+0

ありがとうございました! – TedNugent

0

挿入する列の数が分かっている場合は、挿入クエリを作成したのと同じようにすることができます。明示的にデータを追加したい列を名前を付け、あなたが空のままの列が空であることが許可されていることを確認します(NULLまたはデフォルト= 0)

INSERT INTO MyDB.myTable (Level_1, Level_2, ...) VALUES (Val_1, Val_2, ...); 

別のアプローチは、各挿入された値を格納するだろう別の行このようにして、テーブルの列数を変更することはありません。 - ID(BIGINT: - ID - - レベル 値

あなたはそれぞれのIDを登録することができます別のテーブルを持つことができ :

はあなたが値のグループごとにIDを持つテーブルを必要とします、自動インクリメント、プライマリキー) - 情報フィールド - タイムスタンプ

ここで、挿入するすべてのデータセットについて、最初に挿入するには一意のIDが必要です。

INSERT INTO register_table (ID, info, timestamp) VALUES (NULL, 'some info', NOW()); 

これはあなたに新しいID(last_inserted_id)を与える:あなたが第二のテーブルを使用する場合は、新しい行を挿入するあなたに新しいIDを与えるだろう。このIDで は今、他のテーブル内のすべての値を挿入します。あなたはまた、カラム名を取得するには、データベースのメタデータを使用することができます

"SELECT Level, _Value FROM _table WHERE ID="+ the_ID +" ORDER BY Level;"; 
+0

問題は、挿入する列の数が分かりません。それはユーザーの好みによって異なり、固定されていません。その場合は – TedNugent

+0

、私は別のアプローチを提案します:列の代わりに行にする:ID、レベル、値の3つの列を持つテーブルがあります。各トランザクションに同じIDを持っている限り、必要なすべてのデータを挿入することができます。 – verhie

+0

詳細を教えてもらえますか? – TedNugent

関連する問題