Comment Créer une clé auto incrémentée sous Mysql
Bonjour à tous
Je voudrais savoir s'l existe avec Mysql une méthode pour créer une clé auto incrémentée ?
en référence a la base de données Firebird ou, on créer un générateur et ensuite un trigger pour l'incrémenter.
En somme comment créer un clé auto-incrémenté avec Mysql ?
Merci à tous
Tables multicolonnes auto-incrémentées
Effectivement, dans MySQL une table ne peut contenir qu'une seule colonne avec l'attribut AUTO_INCREMENT, cette colonne doit nécessairement être définie comme une clé unique, pas nécessairement primaire.
Généralement on se sert de cette colonne comme clé primaire ce qui rend inutilisable cette fonctionnalité par rapport à votre besoin.
La solution vient avec un trigger BEFORE INSERT.
La séquence type de code est :
Code:
1 2 3 4 5 6
| SELECT COALESCE(MAX(MyColonneAutoIncrementToutDeMonCru), 0) + 1
FROM my_table
WHERE Restriction /* si pas de restriction, MyColonneAutoIncrementToutDeMonCru risque de valoir exactement la valeur de la PK auto-incrémentée automatiquement par mySQL */
INTO $MyColonneAutoIncrementToutDeMonCru ; /* Une variable locale du trigger de type integer */
SET NEW.MyColonneAutoIncrementToutDeMonCru = $MyColonneAutoIncrementToutDeMonCru ; |
Alors évidemment reste à savoir pourquoi on aurait besoin d'utiliser plusieurs colonnes auto-incrémentées !!
Personnellement j'utilise cela pour gérer des clés relatives.
On peut typiquement avoir ce besoin pour gérer les lignes d'adresse d'une adresse
Voici l'exemple du DDL + trigger d'une table de lignes d'adresses intégrant une FK vers une table d'adresses (qui elle contient les données non multivaluées de l'adresse comme le code postal, la commune, etc... )
Code:
1 2 3 4 5 6 7
| CREATE TABLE `addresses_lines` (
`Address` int(10) unsigned NOT NULL,
`LineIndex` tinyint(3) unsigned NOT NULL,
`LineText` varchar(128) NOT NULL,
PRIMARY KEY (`Address`,`LineIndex`),
CONSTRAINT `addresses_lines_Address_FK` FOREIGN KEY (`Address`) REFERENCES `addresses` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Addresses lines'$$ |
Code:
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
| CREATE
DEFINER=`toto`@`%`
TRIGGER `addresses_lines_BINS`
BEFORE INSERT ON `addresses_lines`
FOR EACH ROW
BEGIN
/* ==================================================================================
** Versions 1.0 XXXX-XX-XX Initial version
** ==================================================================================
**
** (D) Internal datas
*/
DECLARE $Version DECIMAL(4,2) UNSIGNED DEFAULT 1.0 ;
DECLARE $LineIndex TINYINT(3) UNSIGNED ;
/*
** (T) Trigger Prolog
*/
SELECT COALESCE(MAX(LineIndex), 0) + 1
FROM addresses_lines
WHERE Address = NEW.Address
INTO $LineIndex ;
SET NEW.LineIndex = $LineIndex ;
END
$$ |
Ne vous posez pas de questions sur les accès concurrents : de tout MySQL s'occupe .....