Maison > Questions et réponses > le corps du texte
J'ai une table (MYSQL) au format suivant ; en supposant que le nom de la table est mytable
:
id | Nom | Groupe |
---|---|---|
123 | Nom 1 | 1 |
124 | Nom 2 | 2 |
125 | Nom 3 | 1 |
126 | Nom 4 |
id
是唯一的并且自动递增。 name
是一个唯一的字符串,group
n'est qu'un entier
Je veux name4
分配给一个尚不存在的新 group
,因此本例中 name4
的 group
不能是 1
或 2
maintenant.
Par exemple, le résultat pourrait être :
id | Nom | Groupe |
---|---|---|
126 | Nom 4 | 3 |
Actuellement, j'appuie sur group
降序排序,只需手动插入最大数字 + 1,但我想知道是否有更好/更快的方法在列中生成新的唯一值。 group
qui n'a d'autre contrainte que d'être un nombre entier.
J'utilise MySQL Workbench, je peux donc utiliser les commandes SQL ainsi que les options spécifiques à Workbench si disponibles.
Si quelque chose n'est pas clair, je serai heureux de vous apporter des éclaircissements.
P粉2054755382023-09-17 00:08:56
Dans MySQL 8.0, vous pouvez obtenir de l'aide sur deux fonctions de fenêtre :
MAX
, récupérez la valeur maximale "groupe"ROW_NUMBER
, récupère la valeur incrémentielle pour chaque NULL présent dans le tableau. Vous pouvez ensuite additionner ces deux valeurs et mettre à jour le tableau avec le champ "Groupe" vide.
WITH cte AS ( SELECT id, name, MAX(group_) OVER() + ROW_NUMBER() OVER(PARTITION BY group_ IS NULL ORDER BY name) AS new_group FROM tab ) UPDATE tab INNER JOIN cte ON tab.id = cte.id AND tab.name = cte.name SET tab.group_ = cte.new_group WHERE tab.group_ IS NULL;
Découvrez la démo ici.
Dans MySQL 5.
SET @maxgroup = NULL;
SELECT MAX(group_) INTO @maxgroup FROM tab;
UPDATE tab
SET group_ = (@maxgroup:= @maxgroup + 1)
WHERE group_ IS NULL;
ORDER BY id;
Découvrez la démo UPDATE
语句中增量更新。 >SETici