1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| CREATE OR REPLACE PROCEDURE test.pr_fix_auto_increment
(
IN nom_bdd VARCHAR(32),
OUT resultat TEXT
)
/************************************************************************************************
Base : test
Objet : Procédure
Auteur : Philippe Leménager
Version : V 1.0 - plemenager - 2023-10-28 - Création
Description : Met l'auto-incrément d'une table à la valeur max de l'id +1
Utilise : information_schema.SCHEMATA - Liste des BDD
information_schema.TABLES - Liste des tables
information_schema.COLUMNS - Liste des colonnes
Historique :
**************************************************************************************************/
BEGIN
DECLARE nom_table VARCHAR(48) DEFAULT NULL;
DECLARE nom_colonne VARCHAR(48) DEFAULT NULL;
DECLARE nb INT DEFAULT 0;
DECLARE autoinc INT DEFAULT NULL;
DECLARE max_id INT DEFAULT NULL;
DECLARE data_type VARCHAR(48) DEFAULT NULL;
DECLARE is_nullable CHAR(3) DEFAULT NULL;
DECLARE commentaire VARCHAR(255) DEFAULT NULL;
DECLARE is_autoinc VARCHAR(48) DEFAULT NULL;
DECLARE requete VARCHAR(255);
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE liste_colonnes CURSOR FOR
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, EXTRA, COLUMN_COMMENT
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = nom_bdd;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- Vérification que la BDD existe
SELECT COUNT(*) INTO nb
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = nom_bdd;
IF nb = 0 THEN
SIGNAL SQLSTATE VALUE '45000'
SET MYSQL_ERRNO = 10027, MESSAGE_TEXT = 'Base de données inexistante';
ELSE
SET resultat = CONCAT('Traitement de la BDD ', nom_bdd, '.\n\r');
END IF;
-- Parcours des colonnes de la BDD
OPEN liste_colonnes;
read_loop: LOOP
FETCH liste_colonnes INTO nom_table, nom_colonne, data_type, is_autoinc, commentaire;
SET resultat = CONCAT(resultat, 'Colonne : ', nom_table, '.', nom_colonne, ' / Extra : ', is_autoinc);
-- Si fin de BDD alors sortie
IF done = TRUE THEN
LEAVE read_loop;
END IF;
-- Traitement de la colonne en auto_increment
IF is_autoinc = 'auto_increment' THEN
-- Récupération de la valeur de l'auto-incrément de la table
SELECT `AUTO_INCREMENT` INTO autoinc
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = nom_bdd
AND TABLE_NAME = nom_table;
-- Récupération de l'identifiant max de la table
SET requete = CONCAT('SELECT MAX(', nom_colonne, ') INTO max_id FROM ', nom_bdd, '.', nom_table);
PREPARE stmt FROM requete;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- Enregistrement des données dans le résultat
SET resultat = CONCAT(resultat, ' / Auto-incrément : ', autoinc, ' / Max id : ', max_id);
-- Si l'identifiant max est supérieur à l'auto-incrément, on change l'auto-incrément
IF max_id > autoinc THEN
SET resultat = CONCAT(resultat, ' => Correction à ', max_id + 1);
SET requete = CONCAT('ALTER TABLE ', nom_bdd, '.', nom_table,
' MODIFY ', nom_colonne, ' ', data_type,
' NOT NULL AUTO_INCREMENT COMMENT ', "'", commentaire, "', AUTO_INCREMENT = ", max_id + 1);
PREPARE stmt FROM requete;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END IF;
SET resultat = CONCAT(resultat, '\n\r');
END LOOP;
CLOSE liste_colonnes;
SET resultat = CONCAT(resultat, 'Base de données ', nom_bdd, ' traitée.');
END |
Partager