如何在MariaDB中基于最后一行值将列值递增1
需求:为MariaDB表中null的id_subjekta列设置递增数值
现有MariaDB中的mape表,需要将id_subjekta列的null值替换为从1开始依次递增的数值,最终效果如下:
|id_subjekata| 1 2 3 4 .....
尝试过的无效方法
方法一:REPLACE INTO语句
执行以下SQL时报错:
REPLACE INTO `mape` (`id`, `naziv_subjekta`, `id_subjekta`, `predlozak`, `sifra`, `naziv`, `opis`, `izradio`, `izradio_id`, `status`, `zakljucak`, `uvodno_o_obvezniku`, `izjava_o_ciljevima`, `sadrzaj`, `redni_broj`, `revizija_broj`, `revizija_datum`, `kontrolirao`, `kontrolirao_id`, `datum_kontrole`, `odobrio_id`, `odobrio`, `datum_odobrenja`, `datum_izrade`, `izradio_funkcija`, `kontrolirao_funkcija`, `odobrio_funkcija`, `tip`, `vrste_organizacijskih`, `suzbijanje_korupcije`, `isu`, `popis`, `popis_tablica`, `popis_grafickih_prikaza`, `popis_slika`, `upravljanje_kvalitetom`, `original_id`, `country`) VALUES (%s, %s, (SELECT MAX(id_subjekta) + 1 FROM id_subjekta, %s, %s,%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);
方法二:UPDATE语句
执行以下SQL后,所有id_subjekta值都变为1,不符合需求:
Update mape Set id_subjekta = id_subjekta + 1;
可行解决方案
方法一:使用会话变量逐行赋值
通过定义会话变量实现递增赋值,仅更新id_subjekta为null的行:
SET @counter = 0; UPDATE mape SET id_subjekta = @counter := @counter + 1 WHERE id_subjekta IS NULL;
如果需要对所有行重新按顺序赋值,去掉WHERE条件即可:
SET @counter = 0; UPDATE mape SET id_subjekta = @counter := @counter + 1;
方法二:使用窗口函数(MariaDB 10.2+支持)
结合窗口函数生成递增序号,通过关联更新实现需求,这里假设id是表的主键或可确定排序的字段,可根据实际调整ORDER BY的排序字段:
UPDATE mape m JOIN ( SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS new_id FROM mape ) t ON m.id = t.id SET m.id_subjekta = t.new_id WHERE m.id_subjekta IS NULL;
内容的提问来源于stack exchange,提问作者user22242313
相关产品推荐
相关产品推荐

