【问题标题】:insert into table select max(column_name)+1插入表选择 max(column_name)+1
【发布时间】:2012-11-08 03:49:13
【问题描述】:

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

【问题讨论】:

  • post_id 为每个用户提供一个从 1 开始的 id。这就是为什么我需要一个单独的列 1 2 3 4 5 6 等。
  • 我不明白。当您希望 gen_id 与 post_id 相同时,为什么还要麻烦添加该列?
  • 我不希望它和 post_id 一样。用户 1 的 post_id 为 123,用户 2 的 post_id 为 12345。 gen_id = 123456789 10 11 12 。它不是从每个用户的 1 开始的。

标签: mysql sql


【解决方案1】:

试试这个:

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

【讨论】:

    【解决方案2】:

    在您的桌子上使用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  ;
    

    【讨论】:

    • 谢谢。对我来说,在 SQL Server SSMS 2016 中,我收到了 LAST_INSERT_ID() 的智能感知错误。它说LAST_INSERT_ID() is not a recognized built in function name。有什么想法吗?
    【解决方案3】:

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

    IFNULL(MAX(number), 0) + 1 
    

    或者更好的查询变成了

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

    【讨论】:

      【解决方案4】:

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

      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 的值以及数据库中该行其余部分的添加值。

      【讨论】:

        【解决方案5】:

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

        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-12-25
          • 1970-01-01
          • 1970-01-01
          • 2020-10-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-21
          • 1970-01-01
          • 2017-03-21
          相关资源
          最近更新 更多