Utilisation de déclencheurs pour définir une clé composite avec incrémentation automatique dans MySQL
MySQL vous permet de créer des clés composites impliquant plusieurs colonnes, mais cela peut être difficile de configurer l'auto-incrémentation pour de telles clés, en particulier avec les tables InnoDB.
Scénario
Considérez une table qui contient deux clés étrangères et une colonne d'auto-incrémentation de la clé primaire composite :
CREATE TABLE `issue_log` ( `sr_no` INT NOT NULL AUTO_INCREMENT, `app_id` INT NOT NULL, `test_id` INT NOT NULL, `issue_name` VARCHAR(255) NOT NULL, PRIMARY KEY (app_id, test_id, sr_no) );
Limitations de l'auto-incrémentation dans InnoDB
InnoDB restreint l'auto-incrémentation à une seule colonne de la clé primaire. Si vous essayez de définir sr_no à la fois comme incrémentation automatique et comme partie de la clé composite, vous rencontrerez une erreur indiquant : "Définition de table incorrecte ; il ne peut y avoir qu'une seule colonne automatique et elle doit être définie comme une clé."
Solution : Utilisation de déclencheurs
Pour mettre en œuvre ce scénario, vous pouvez utiliser un déclencheur pour définir automatiquement la valeur de sr_no avant chaque opération INSERT :
DELIMITER $$ CREATE TRIGGER xxx BEFORE INSERT ON issue_log FOR EACH ROW BEGIN SET NEW.sr_no = ( SELECT IFNULL(MAX(sr_no), 0) + 1 FROM issue_log WHERE app_id = NEW.app_id AND test_id = NEW.test_id ); END $$ DELIMITER ;
Ce déclencheur calcule la nouvelle valeur de sr_no en recherchant la valeur existante maximale pour les app_id et test_id donnés, puis l'incrémente de 1. En utilisant un déclencheur, vous pouvez vous assurer que sr_no est défini correctement pour chaque nouvelle ligne, même si c'est le cas. pas directement définie comme une colonne à incrémentation automatique.
Remarque : N'oubliez pas d'ajuster la structure de la table et la définition du déclencheur pour qu'elles correspondent au nom de votre table et aux noms de champs spécifiques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!