1

我正在为一个应用程序开发一个评论数据库,我有以下我不知道如何解决的问题。

基本上我有一张这样的桌子:

comment_id | comment_text | thread_id | internal_id
-----------------------------------------------------
1              text1           1            1
2              text2           2            1
3              text3           1            2

基本上,我想要的是,如果我使用thread_id = 1进行插入,则internal_id应该自动为3

有没有办法通过使用 INSERT 查询来做到这一点?因为我不想使用 PHP 脚本来获取最后一个 internal_id,然后插入这个递增的数字。

提前致谢

4

4 回答 4

1

试一试,假设comment_id设置为auto_increment.

INSERT INTO tableName (comment_text, thread_id, internal_id)
SELECT  'your comment' AS comment_text,
        1 AS thread_id,
        COALESCE(MAX(internal_id) + 1, 1) AS internal_id
FROM    tableName
WHERE   thread_id = 1
于 2013-07-20T17:21:35.080 回答
1

您可以使用多种解决方案:

  1. 您可以尝试使用触发器在 thread_id 的特定范围内计算 internal_id。 http://dev.mysql.com/doc/refman/5.5/en/trigger-syntax.html

  2. 创建具有结构的附加表:thread_id, last_internal_id。从此表中读取,将值放入特定注释并增加 last_internal_id。

此外,您应该考虑到,如果两个人同时添加 2 条评论,您将使用什么方法都可以获得相同的 internal_id 值。所以为了避免它,你应该使用锁或事务。

于 2013-07-20T18:05:38.483 回答
0

您可以使用以下内容:

INSERT INTO TABLE_NAME (internal_id,comment_text,thread_id ) (
SELECT MAX(internal_id)+1,'TEXT',1 FROM TABLE_NAME WHERE thread_id =1 AND (
SELECT MAX(internal_id) FROM TABLE_NAME WHERE thread_id =1));

我没有数据库来测试它,所以我可能错了。如果我犯了错误,请纠正我。

于 2013-07-20T19:03:12.973 回答
0

如果您的引擎是 MyISAM,您可以internal_id将 AUTO_INCREMENT 作为 tuple 的一部分(thread_id, internal_id)

看一下这个:

http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

对于 MyISAM 和 BDB 表,您可以在多列索引中的辅助列上指定 AUTO_INCREMENT。在这种情况下,AUTO_INCREMENT 列的生成值计算为 MAX(auto_increment_column) + 1 WHERE prefix=given-prefix。当您要将数据放入有序组时,这很有用。

于 2013-07-20T17:24:18.597 回答