我的表中通常有“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
有什么想法吗?
答案 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
替换为您的表名和列名id
,new_id
和year.
答案 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;
}