批处理执行的SQL语句,用于更新两个表

时间:2014-03-27 01:35:48

标签: mysql sql combobox sql-update

我有一个问题对我来说似乎很难,我有一个表类别和一个表格问题(这个表有category_id字段,默认为0),在我的表格上我可以从组合框中选择一个类别,我的问题给你,如何我可以将新问题插入/更新到现成类别吗? 到目前为止,我的代码只添加一个新问题,其中0为类别,而不是组合框中的那个(组合框仅显示文本)

  

String SQL2 =" UPDATE gamequestions SET question_id =' gamecategory.category_name =" + jComboBox1.getSelectedItem()的toString()+&#34。 ,gamequestions.category_id = gamecategory.category_id'在哪里问题_id =' 0' ;&#34 ;;               stmt.addBatch(SQL2);

这是更新后的代码

"INSERT INTO gamequestions (question_id, category_id, question) SELECT NULL as question_id ,c.category_id, q.question='"+jTextArea1.getText()+"' FROM gamecategory c, gamequestions q WHERE  c.category_name = '"+Combo_click+"' ORDER BY c.category_id LIMIT 1"

我无法弄清楚如何让jtextarea填充列问题。

1 个答案:

答案 0 :(得分:1)

我无法弄清楚你的代码应该做什么。

您说要插入具有category_id列指定值的新行(硬编码为零以外的其他行),或者您想要更新现有行以更改{{{ 1}}列。

让我们从需要发送到数据库的SQL文本开始。

要更改现有行,例如:

category_id

要插入新行(假设UPDATE gamequestions q SET q.category_id = 2 WHERE q.question_id = 42 为auto_increment),例如:

question_id

组合框选择返回的值将取代' 2'在上面的例子中。

如果你的组合框没有返回INSERT INTO gamequestions (question_id, category_id) VALUES (NULL, 2) 值,但是从category_id表返回其他列的值,你希望SQL语句执行&#34 ;查找"使用gamecategory值来自category_id表的gamecategory值,一种方法是将子查询作为分配给列的值...:

category_name

对于UPDATE gamequestions q SET q.category_id = (SELECT c.category_id FROM gamecategory c WHERE c.category_name = ? ORDER BY c.category_id LIMIT 1 ) WHERE q.question_id = 42 ,如果您只想在INSERT文本与category_name表中的行匹配时插入一行,则可以像这样使用SQL:

gamecategory

如果INSERT INTO gamequestions (question_id, category_id) SELECT NULL as question_id , c.category_id FROM gamecategory c WHERE c.category_name = ? ORDER BY c.category_id LIMIT 1 表中没有与gamecategory匹配指定值(在category_name所在位置提供)的行,则不会插入任何行。

如果你想继续插入行,即使category_name文本不匹配,并且?设置为默认值0,那么这样的事情,带有子查询在SELECT列表中:

category_id

第一步是真正获得一些符合你想要的SQL语句。

第二步是将SQL文本嵌入到您的应用程序中,使用适当的绑定变量/替换并避免SQL注入漏洞。第二步很难弄明白,同时也不必同时完成第一步。


<强>后续

如果要在INSERT INTO gamequestions (question_id, category_id) SELECT NULL as question_id , IFNULL( ( SELECT c.category_id FROM category c WHERE c.category_name = ? ORDER BY c.category_id LIMIT 1 ) ,0) AS category_id 中插入一行,我们希望在INSERT语句中提供gamequestions列的值,它不会来自question表中的行。

我们作为INSERT的一部分运行的gamequestionsSELECT表中获取category_id的值;没有必要加入游戏项目表。

我认为您需要以下形式的SQL:

gamecategory

这将插入一个新行,其值为

  • INSERT INTO gamequestions ( question_id , category_id , question , another_column , some_id ) SELECT NULL , c.category_id , 'my question text goes here' , 'fee fi fo fum' , 42 FROM gamecategory c WHERE c.category_name = 'category name text goes here' ORDER BY c.category_id LIMIT 1 设置为整数值42
  • some_id设置为字符串值another_column
  • 'fee fi fo fum'设置为字符串值question
  • 'my question text goes here'设置为从category_id
  • 检索到的值

理想情况下,您根本不需要从数据库中查找category_id;理想情况下,您的组合框会显示gamecategory,但会返回category_name的值,因此您可以直接插入:

category_id

无需在插入上运行SELECT。

理想情况下,组合框不会返回 INSERT INTO gamequestions ( question_id , category_id , question , another_column , some_id ) VALUES ( NULL , 5 , 'my question text goes here' , 'fee fi fo fum' , 42 ) 文本作为值,而是返回相应的category_name值。把&#34;查找&#34;进入下拉

例如,表示category_id表内容:

gamecategory

在像这样的HTML组合框中:

id  category_name
--  ---------------
 0  Uncategorized
 1  Action-Adventure
 2  Adventure
 3  Aerial Combat
 4  Fighting
 5  First Person Shooter
 6  Fitness

要从javascript中的组合框中获取值,例如:

 <select name=category_id>
 <option value='0' selected>Uncategorized</option>
 <option value='1'>Action-Adventure      </option>
 <option value='2'>Adventure             </option>
 <option value='3'>Aerial Combat         </option>
 <option value='4'>Fighting              </option>
 <option value='5'>First Person Shooter  </option>
 <option value='6'>Fitness               </option>
 </select>

<强>后续

可以从$('select[name="category_id"]').val(); 语句中省略question_id列,然后我们就不需要为其提供INSERT值。

NULL

-OR -

 INSERT INTO gamequestions (category_id, question, another_column)
 VALUES (5, 'my question text goes here', 'fee fi fo fum');

<强>后续

问:如果我在使用INSERT INTO游戏问题时在问题列中插入多行,那么我可以拥有3个文本字段,每个文本字段包含不同的问题,但每个都会进入相同的游戏类别INSERT INTO gamequestions (question_id,category_id,question,another_column,some_id)VALUES(NULL,5,&#39;我的问题文本在这里&#39;,&#39;费用为f&f;&#39;,42)

A:使用VALUES子句,您可以执行多行插入(MySQL提供的非常强大且非标准的扩展)。

您要发送到数据库的SQL需要看起来像这样:

 INSERT INTO gamequestions (category_id, question, another_column)
 SELECT 5, 'my question text goes here', 'fee fi fo fum'

(我已经省略了question_id列,我们将为其分配DEFAULT NULL值,并且实际值将由AUTO_INCREMENT分配。请注意,该列仍在&#34;插入&#34 ;与行的其余部分一起,我们只提供一个不完整的列列表,并让MySQL为我们未指定的列分配默认值。)

真正的&#34;技巧&#34;这是我们有三行,三组值。每行的值集都包含在parens中,就像在单行插入中一样。但MySQL允许我们使用逗号,另一行使用另一组值。

每一行分配的category_id必须为每一行单独提供,它可以是与前一行相同的值,或者完全不同,不会产生任何差异。 (值的唯一区别在于MySQL是否会抛出错误,因为违反了约束,转换数据类型时出现问题,等等。)

(MySQL忽略了所有间距,我只是添加了间距以使其更具可读性。)