簡體   English   中英

插入表中選擇max(column_name)+1

[英]insert into table select max(column_name)+1

我有這樣的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.

嘗試這個:

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

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

對於我的情況,要增加的第一個數字為null。 我決心

IFNULL(MAX(number), 0) + 1 

或更好的查詢成為

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

這是“Autos”表及其開頭包含的數據:

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

AutoID列是一個自動遞增列,因此不必將其包含在insert語句中。

除了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以及數據庫中該行的其余部分的添加值。

我想要顯示的方式沒有發生......所以我將從頭開始:首先我創建了一個表。

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語句只是為了確保它正常工作....希望這有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM