Мой собственный автоинкремент - PullRequest
0 голосов
/ 05 марта 2012

У меня есть обычный id в моей таблице, но мне также нужен код, который будет похож на id, но зависит от года. Это означает, что это будет каким-то образом автоинкремент, но будет начинаться с 1 для каждого нового года. Когда я вставляю новую строку, я просто использую

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

и увеличение на единицу.

Но мой проект уже запущен, и я хотел бы получить запрос, который бы устанавливал эти коды для уже существующих строк.

Так что теперь мой стол выглядит так ->

Текст 2011 'NULL' || Текст 2011 'NULL' || Текст 2011 'NULL' || Текст 2012 'NULL' || Текст 2012 'NULL'

и мне нужно изменить его на

Текст 2011 1 || Текст 2011 2 || Текст 2011 3 || Текст 2012 1 || Текст 2012 2

Есть идеи?

Ответы [ 3 ]

1 голос
/ 05 марта 2012

Я думаю, вы могли бы использовать запрос, подобный этому:

 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

Просто измените запрос на ОБНОВЛЕНИЕ.Однако это может занять некоторое время, в зависимости от размера таблицы.

РЕДАКТИРОВАТЬ - Запрос на обновление:

 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 именем таблицы и именами столбцов id, new_id и year.

0 голосов
/ 05 марта 2012

Сначала загрузите вашу последнюю запись, предположим,

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;

}
0 голосов
/ 05 марта 2012

Вы можете использовать триггер 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)...
...