使用Java动态创建MySQL表列

时间:2016-02-23 10:59:32

标签: java mysql arrays

尝试通过向其中动态添加列来更改MySQL表时出错,其中列名是存储在Java数组变量中的值。

 try
{  
Class.forName("com.mysql.jdbc.Driver");        
Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql","root","123");  
Statement stmt=con.createStatement();        
stmt.executeUpdate("create table distable (patient integer)");  
PreparedStatement pst=con.prepareStatement("alter table distable add ? varchar(50)");  
for(i=1;i<=col;i++)
{
pst.setString (1,out[i]);
pst.executeUpdate();
}        
con.close();        
}
catch(Exception e)
{
 System.out.println(e);
}

这里con是保持连接的变量。使用连接我在MySQL中创建了一个表,表的名称是&#34; distable&#34;。桌子&#34; distable&#34;最初包含一个名为Patient的整数列。

我需要改变桌子&#34; distable&#34;并在运行时添加新列。正如我所说,每列的名称必须是Java中存储在数组中的值。因此我使用了PreparedStatement,其中包含一个&#39;?&#39;这是列名的替代品。

在运行时插入的列数存储在变量&#34; col&#34;中。我已经使用setString()在运行时设置列名。列名存储在名为&#34; out&#34;的数组中。我已经使用executeUpdate()来执行查询。

当我运行此代码时,我得到的错误是:

  

com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:您有错误   在你的SQL语法中;查看与MySQL对应的手册   服务器版本,以便在&#39; &#39; GSM22449&#39; 附近使用正确的语法   VARCHAR(50)&#39;在第1行

&#39; GSM22449&#39;是存储在数组[ out [1] = GSM22449]中的第一个值。因此,它实际上是在&#39;?&#39;的地方取而代之的?在查询中。但查询未执行。

错误在哪里?语法有问题吗?

1 个答案:

答案 0 :(得分:0)

我认为你不需要指定&#34; COLUMN&#34;添加列时的关键字。以下是添加列

的正确语法
ALTER TABLE table_name
ADD column_name datatype

所以你的语句创建行应该是这样的,

PreparedStatement pst=con.prepareStatement("alter table distable add ? varchar(50)"); 

<强>更新: 刚想通了?参数仅适用于数据,不适用于列名。如果您需要以这种方式生成列名称,则可以使用字符串连接。例如,

"alter table distable add " + COLUMN_NAME + " varchar(50)"

确保列名不是用户输入,否则它将邀请XSS(跨站点脚本)。