mysql - 批处理执行的SQL语句可更新两个表

标签 mysql sql combobox sql-update

我有一个对我来说似乎很困难的问题,我有一个表Category和一个表Questions(该表的category_id字段默认为0),在我的表单上我可以从组合框中选择一个类别,然后问我一个问题,如何插入/将表格中的新问题更新到表格中?
到目前为止,我的代码仅添加了一个新问题,该问题的类别为0,而不是组合框(组合框仅显示文本)


  字符串SQL2 =“ UPDATE gamequestions SET question_id ='gamecategory.category_name =” + jComboBox1.getSelectedItem()。toString()+“,gamequestions.category_id = gamecategory.category_id'WHERE question_id ='0';”;
              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填充列问题。

最佳答案

我不知道您的代码应该做什么。

您说要插入category_id列具有指定值的新行(不是硬编码零),或者要更新现有行以更改category_id列的值。

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

要更改现有行,例如:

UPDATE gamequestions q
   SET q.category_id = 2 
 WHERE q.question_id = 42


例如,要插入新行(假设question_id为auto_increment):

INSERT INTO gamequestions (question_id, category_id) VALUES (NULL, 2)


从组合框选择中返回的值将替换上例中的“ 2”。

如果您的组合框没有返回category_id值,而是从gamecategory表返回了其他列的值,并且您希望SQL语句对<< cc>表使用category_id值,一种实现方法是将子查询作为分配给列的值...:

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


对于gamecategory,如果只想在category_name文本与INSERT表中的行匹配时插入一行,则可以使用如下SQL:

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


如果category_name表中没有与gamecategory匹配指定值的行(在gamecategory处提供),则不会插入任何行。

如果您要继续并插入行,即使category_name文本不匹配,并且category_name设置为默认值0,则类似这样,在SELECT列表中有一个子查询:

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


第一步实际上是获得一些可以执行所需操作的SQL语句。

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



跟进

如果要在?中插入行,我们希望INSERT语句中提供category_id列的值,而该值将不会来自gamequestions表中的行。

我们作为INSERT的一部分运行的question是从gamequestions表中获取SELECT的值的;无需加入gamequestions表。

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

 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


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


category_id设置为42的整数
gamecategory设置为some_id的字符串值
another_column设置为'fee fi fo fum'的字符串值
question设置为从'my question text goes here'表检索的值


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

 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
 )


无需在插入文件上运行SELECT。

理想情况下,组合框将返回适当的category_name值,而不是返回category_id文本作为值。将“查找”放入下拉菜单

例如,代表category_name表内容:

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


在这样的HTML组合框中:

 <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>


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

$('select[name="category_id"]').val();


跟进

category_id语句中可以省略gamecategory列,因此我们不需要为其提供question_id值。

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


-要么-

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


跟进

问:如果我在使用INSERT INTO游戏问题时在问题列中插入多行怎么办,那么我可以拥有3个文本字段,每个文本字段包含不同的问题,但每个文本字段都属于同一游戏类别INSERT INTO游戏问题(question_id,category_id,question,another_column,some_id )值(NULL,5,'我的问题文本在这里','fee fi fofum',42)

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

您将发送到数据库的SQL看起来应该像这样:

INSERT INTO gamequestions (category_id,question,another_column,some_id)
VALUES 
 (5, 'my question text goes here'  , 'fee fi fo fum'     , 42)
,(5, 'another question to be added', 'i smell the blood' , 84)
,(5, 'and this is a third row'     , 'of an englishman'  , 17)


(我省略了question_id列,我们将其分配为DEFAULT NULL值,而实际值将由AUTO_INCREMENT分配。请注意,该列仍与该行的其余部分一起被“插入”,只是给出不完整的列列表,并让MySQL为我们未指定的列分配默认值。)

这里真正的“技巧”是我们有三行,三组值。每一行的值集都用括号括起来,就像在单行插入中一样。但是MySQL允许我们加上逗号,为另一行加上另一组值。

必须为每行分别提供在每行上分配的category_id,它可以与前几行相同,也可以完全不同,没有任何区别。 (值的唯一区别是,由于违反约束,转换数据类型的问题等原因,MySQL是否将引发错误。)

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

关于mysql - 批处理执行的SQL语句可更新两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22676624/

相关文章:

mysql - 表未更新。无法在 FROM 子句中指定更新目标表 'nodeassociation'

php - 删除单元格 MySQL 中的重复值

c# - 在 SL ComboBox 上使用 CollectionView 刷新时 SelectedItemIndex 不匹配

java - 使用 Struts 2 填充组合框时出现问题

javascript - 多选组合框和 tpl - 在 Ext JS 中标记选定条目的问题

php - 带有 INNER JOIN 的 MySQL SELECT 2 表

php - 根据两个或多个单独的日期选择多行

sql - Oracle:跨多个列的 "grep"?

sql - 如何在 API 的查询字符串中设计通用过滤运算符?

sql - 使用左连接的 SUM 得到错误的结果