插入表中选择max(column_name)+1

时间:2012-11-08 03:49:14

标签: mysql sql

我有这样的mysql表:

CREATE TABLE `posts` (
    `post_id` INT(10) NOT NULL AUTO_INCREMENT,
    `post_user_id` INT(10) NOT NULL DEFAULT '0',
    `gen_id` INT(10) NOT NULL DEFAULT '0',
    PRIMARY KEY (`post_user_id`, `post_id`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;

当我这样做时:

insert into posts (post_user_id) values (1);
insert into posts (post_user_id) values (1);
insert into posts (post_user_id) values (2);
insert into posts (post_user_id) values (1);
select * from posts;

我明白了:

post_id | post_user_id | gen_id
1                  1     0
2                  1     0
1                  2     0
3                  1     0

为每个唯一身份用户生成一个唯一的post_id。

我需要gen_id列为1 2 3 4 5 6等。插入时如何增加此列。我试过下面的那个,但是不行。什么是正确的方法?

insert into posts (post_user_id,gen_id) values (1,select max(gen_id)+1 from posts);
//Select the highest gen_id and add 1 to it.

5 个答案:

答案 0 :(得分:11)

试试这个:

  INSERT INTO posts (post_user_id,gen_id) 
  SELECT 1, MAX(gen_id)+1 FROM posts;

答案 1 :(得分:3)

在桌面上使用TRIGGER。这个示例代码可以帮助您入门:

DELIMITER //
CREATE TRIGGER ai_trigger_name AFTER INSERT ON posts
FOR EACH ROW
BEGIN

    UPDATE posts 
       SET gen_id = (SELECT MAX(gen_id) FROM posts) + 1
     WHERE post_id = LAST_INSERT_ID()
     LIMIT 1;

END;//
DELIMITER  ;

答案 2 :(得分:1)

对于我的情况,要增加的第一个数字为null。我解决了

IFNULL(MAX(number), 0) + 1 

或更好的查询成为

SELECT IFNULL(MAX(number), 0) + 1 FROM mytable;

答案 3 :(得分:1)

以下是“Autos”表及其开头的数据:

app/assets/javascript/application.js

AutoID | Year | Make | Model | Color |Seq 1 | 2012 | Jeep |Liberty| Black | 1 2 | 2013 | BMW | 330XI | Blue | 2 列是一个自动递增列,因此不必将其包含在insert语句中。

除了AutoID列(整数列/字段)之外,其余列都是varchars。

如果你想这样做,当你将下一行插入表格并且Seq列自动递增到#3时,你需要按如下方式编写你的查询:

Seq

我首先放置INSERT INTO Autos ( Seq, Year, Make, Model, Color, ) Values ( (SELECT MAX(Seq) FROM Autos) + 1, --this increments the Seq column 2013,'Mercedes','S550','Black'); 列的原因是为了确保它能正常工作......无论你把它放在哪里都没关系,但比抱歉更安全。

Seq列现在应该具有值Seq以及数据库中该行其余部分的附加值。

答案 4 :(得分:0)

我想要显示的方式没有发生......所以我将从头开始:首先我创建了一个表。

create table Cars (  
AutoID int identity (1,1) Primary Key,
Year int,
Make varchar (25),
Model varchar (25),
TrimLevel varchar (30),
Color varchar (30),
CreatedDate date,
Seq int
)

其次我插入了一些虚拟值

insert into Cars values (

2013,'Ford' ,'Explorer','XLT','Brown',GETDATE(),1),
(2011,'Hyundai' ,'Sante Fe','SE','White',GETDATE(),2),
(2009,'Jeep' ,'Liberty','Jet','Blue',GETDATE(),3),
(2005,'BMW' ,'325','','Green',GETDATE(),4),
(2008,'Chevy' ,'HHR','SS','Red',GETDATE(),5);

插入完成后,您应该有5行数据。 由于Seq列不是自动增量列,并且您希望确保下一个Seq的数据行自动递增到#6并且其后续行也会递增,因此您需要编写以下代码:

INSERT INTO Cars
(
  Seq,
  Year,
  color,
  Make,
  Model,
  TrimLevel,
  CreatedDate
)
Values
(
  (SELECT MAX(Seq) FROM Cars) + 1,
  2013,'Black','Mercedes','A550','AMG',GETDATE());

我使用不同的数据多次运行此insert语句只是为了确保它正常工作....希望这会有所帮助!