我有一个对我来说似乎很困难的问题,我有一个表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/