5

我有这个 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.
4

5 回答 5

13

尝试这个:

  INSERT INTO posts (post_user_id,gen_id) 
  SELECT 1, MAX(gen_id)+1 FROM posts;
于 2012-11-08T04:02:56.807 回答
3

TRIGGER在你的桌子上使用 a 。此示例代码可以帮助您入门:

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  ;
于 2012-11-08T03:56:17.393 回答
2

对于我来说,第一个要增加的数字是空的。我解决

IFNULL(MAX(number), 0) + 1 

或者更好的查询变成

SELECT IFNULL(MAX(number), 0) + 1 FROM mytable;
于 2014-01-17T14:25:31.623 回答
2

这是表格“汽车”及其包含的数据:

AutoID | Year | Make | Model | Color |Seq
1      | 2012 | Jeep |Liberty| Black | 1 
2      | 2013 | BMW  | 330XI | Blue  | 2 

AutoID列是自动递增列,因此不必将其包含在插入语句中。

Seq除了作为整数列/字段的列之外,其余列都是 varchars 。

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

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列现在应该具有 的值3以及数据库中该行其余部分的添加值。

于 2016-01-06T05:20:58.663 回答
1

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

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

我已经使用不同的数据多次运行此插入语句,以确保它正常工作....希望这会有所帮助!

于 2016-01-06T05:52:23.010 回答