我自己的自动增量

时间:2012-03-05 13:14:14

标签: mysql increment

我的表中通常有“id”,但我还需要一个“代码”,就像id一样,但具体年份。这意味着它将以某种方式自动增加,但每个新年将从1开始。 当我插入新行时,我只需使用

 SELECT MAX(code) WHERE YEAR(time) = YEAR(CURRENT_DATE)

并递增一个。

但是我的项目已经运行了,我希望有一个查询,它会为现有的行设置这些代码。

所以现在我的表看起来像这样 - >

  

Text 2011'NULL'|| Text 2011'NULL'|| Text 2011'NULL'||文字2012   'NULL'|| Text 2012'NULL'

我需要将其更改为

  

Text 2011 1 ||文字2011 2 ||文本2011 3 || Text 2012 1 ||文字2012   2

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我认为你可以使用像这样的查询:

 SELECT T1.id, T1.year, COUNT(T2.id) AS new_id
 FROM `table` T1
 JOIN `table` T2 ON T1.id > T2.id AND T1.year = T2.year
 GROUP BY T1.id, T1.year
 ORDER BY T1.year, new_id

只需更改UPDATE。可能需要一些时间,具体取决于表格大小。

编辑 - 更新查询:

 CREATE TABLE temp_table (
   id INT NOT NULL,
   new_id NOT NULL,       
   PRIMARY KEY (id)
 );

 INSERT INTO temp_table
   SELECT T1.id, COUNT(T2.id) AS new_id
   FROM `table` T1
   JOIN `table` T2 ON T1.id > T2.id AND T1.year = T2.year
   GROUP BY T1.id, T1.year
   ORDER BY T1.year, new_id;

 UPDATE `table` t
   SET t.new_id = (SELECT tmp.new_id FROM temp_table tmp WHERE tmp.id = t.id)
 WHERE t.new_id IS NULL;

 DROP TABLE temp_table;

未经测试但应该非常接近。将table替换为您的表名和列名idnew_idyear.

答案 1 :(得分:0)

您可以使用BEFORE INSERT触发器来更改NULL值,例如 -

CREATE TABLE years(
  `year` INT(11) DEFAULT NULL,
  code INT(11) DEFAULT NULL
);

DELIMITER $$

CREATE TRIGGER trigger_name
  BEFORE INSERT
  ON years
  FOR EACH ROW
BEGIN
  IF NEW.code IS NULL THEN
    SET NEW.code = (SELECT IFNULL(MAX(code), 0) + 1 FROM years WHERE year = NEW.year);
  END IF;
END$$

DELIMITER ;

INSERT INTO years VALUES(1, NULL),(2, NULL)...

答案 2 :(得分:0)

首先获取你的最后一条记录,假设

Year |  id
2012 |  4

if(Year = current_year){

id = your_last_id+1;
year = current_year;

insert in your Table

} else {

id = 1;
year = current_year;

}