2013-07-20 69 views
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应自动。

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

在此先感谢

回答

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 
0

如果你的引擎是MyISAM的,你可以有internal_id被AUTO_INCREMENT作为一个元组(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。当您想要将数据放入有序组时,这非常有用。

+0

幸运的是我的引擎是MyISAM。我如何应用这些更改?作为默认值?我有点困惑 – themazz

+0

像CREATE TABLE注释(comment_id INTEGER NOT NULL,comment_text TEXT,thread_id INTEGER NOT NULL,internal_id INTEGER NOT NULL,PRIMARY KEY(thread_id,internal_id))。然后当你插入时,不要为internal_id指定一个值。 –

+0

哦,你当然应该将internal_id设置为AUTO_INCREMENT –

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

还应该考虑到,这不要紧,接近你会用,你可以得到相同的值INTERNAL_ID如果两个人增加了2条评论在同一时间。所以为了避免它,你应该使用锁或事务。

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

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

相关问题