现状:我有一个结表中的列testFK
,questionFK
和ordinal
。
testFK | questionFK | ordinal
2 14 1
2 15 2
2 16 3
_____________________________
NEW 2 17 4
我想使用testFK = 2
和向表中添加新行questionFK = 17
,但是,我希望ordinal
根据表中已有的内容自动生成。由于最高序数是3,所以我想SQL
自动生成4。
我试过了:
$stmt = $db->prepare('
SET @QOrdinal = (SELECT MAX(ordinal) FROM junc_test_question WHERE testFK = ?);
INSERT
INTO junc_test_question
(junc_test_question.testFK, junc_test_question.questionFK, junc_test_question.ordinal)
VALUES (?, ?, @QOrdinal);
');
$stmt->bind_param('iii', $this->testID, $this->testID, $question_id);
//var_dump($stmt);
if($stmt->execute()) {
return true;
} else {
return false;
}
如果我对其中的硬代码进行编码,则此方法有效ordinal
,但我似乎无法靠它SQL
自己完成。
任何输入,不胜感激!
更新:我得到的错误
Fatal error: Call to a member function bind_param() on a non-object in \classes\Test.php on line 91
因此,我假设的SQL
是不正确的。
在操作人员最近的评论中,以下提出的解决方案不合适。
如果使用MyISAM表类型并定义一个主键,其中自动增量列为第二个主键,则MyISAM自动计算按第一个字段分组的增量(请参见链接文档中的MyISAM注释):
对于MyISAM表,可以在多列索引的第二列上指定AUTO_INCREMENT。在这种情况下,将为AUTO_INCREMENT列生成的值计算为MAX(auto_increment_column)+ 1 WHERE prefix = given-prefix。当您要将数据放入有序组中时,这很有用。
因此,您可以按如下所示简单地定义表-尽管实际上我不确定我是否会存储此序数:
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(testFK INT NOT NULL
,ordinal INT NOT NULL AUTO_INCREMENT
,questionFK INT NOT NULL
,PRIMARY KEY(testFK,ordinal)
) ENGINE = MYISAM;
INSERT INTO my_table VALUES
(2,1,14),
(2,2,15),
(2,3,16);
INSERT INTO my_table (testFK,questionFK) VALUES
(2,17);
SELECT * FROM my_table;
+--------+---------+------------+
| testFK | ordinal | questionFK |
+--------+---------+------------+
| 2 | 1 | 14 |
| 2 | 2 | 15 |
| 2 | 3 | 16 |
| 2 | 4 | 17 |
+--------+---------+------------+
或者,您可以按照以下方式做一些事情(简化)-但我永远不会认真倡导这种解决方案:
INSERT INTO my_table (testFK,questionFK,ordinal)
SELECT 2,18,MAX(ordinal+1) FROM my_table;
SELECT * FROM my_table;
+--------+---------+------------+
| testFK | ordinal | questionFK |
+--------+---------+------------+
| 2 | 1 | 14 |
| 2 | 2 | 15 |
| 2 | 3 | 16 |
| 2 | 4 | 17 |
| 2 | 5 | 18 |
+--------+---------+------------+
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句