déclencheurs MySQL ont un soutien implicite de la transaction, de sorte que le déclencheur ne peut pas utiliser des instructions qui commencent explicitement ou implicitement ou mettre fin à une transaction telle que START TRANSACTION
, COMMIT
ou ROLLBACK
.
Il n'est pas nécessaire dans MySQL d'activer l'insertion de valeurs dans les colonnes de clé primaire - cela est déjà autorisé. Vous pouvez cependant activer contrainte de clé étrangère vérification et la vérification des index unique:
http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_unique_checks
Une façon courante de faire est de stocker les valeurs existantes dans les variables utilisateur, modifier les paramètres, puis restaurer la paramètres après votre script est terminé:
SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
-- Your SQL statements here.
SET [email protected]_FOREIGN_KEY_CHECKS;
SET [email protected]_UNIQUE_CHECKS;
Je ne sais pas pourquoi vous devez faire dans votre déclencheur, de sorte que votre déclencheur MySQL ressemblerait à quelque chose comme ceci:
DELIMITER |
CREATE TRIGGER T1 AFTER INSERT ON A FOR EACH ROW
BEGIN
INSERT INTO B (id, text) VALUES (NEW.id, NEW.text);
INSERT INTO C (id, text) VALUES (NEW.id, NEW.text);
END;|
DELIMITER ;
est ici les résultats d'un test rapide:
CREATE TABLE `A` (
`id` int(11) NOT NULL auto_increment,
`text` varchar(255) default NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `B` (
`id` int(11) NOT NULL auto_increment,
`text` varchar(255) default NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `C` (
`id` int(11) NOT NULL auto_increment,
`text` varchar(255) default NULL,
PRIMARY KEY (`id`)
);
DELIMITER |
CREATE TRIGGER T1 AFTER INSERT ON A FOR EACH ROW
BEGIN
INSERT INTO B (id, text) VALUES (NEW.id, NEW.text);
INSERT INTO C (id, text) VALUES (NEW.id, NEW.text);
END;|
DELIMITER ;
INSERT INTO `A` (id, text) VALUES (1, 'Line 1');
INSERT INTO `A` (id, text) VALUES (2, 'Line 3');
INSERT INTO `A` (id, text) VALUES (3, 'Line 3');
SELECT * FROM `A`;
+----+--------+
| id | text |
+----+--------+
| 1 | Line 1 |
| 2 | Line 3 |
| 3 | Line 3 |
+----+--------+
SELECT * FROM `B`;
+----+--------+
| id | text |
+----+--------+
| 1 | Line 1 |
| 2 | Line 3 |
| 3 | Line 3 |
+----+--------+
SELECT * FROM `C`;
+----+--------+
| id | text |
+----+--------+
| 1 | Line 1 |
| 2 | Line 3 |
| 3 | Line 3 |
+----+--------+
Si vous voulez quelque chose de similaire à TRY
... CATCH
, vous aurez besoin d'utiliser des gestionnaires à la place:
http://dev.mysql.com/doc/refman/5.1/en/declare-handler.html
Voici la documentation sur les déclencheurs MySQL:
http://dev.mysql.com/doc/refman/5.1/en/commit.html
MSSQL (2005+)> MySQL – Dubs
Si vous le faites maintenant dans MSSQL SeErver, alors vous vous trompez. C'est une pratique non contrôlable dans un déclencheur. Identité uinisert ne devrait être que pour l'utilisation très occasionnelle d'un dba qui déplace des documents anciens vers un nouvel emplacement. Si vous devez activer l'insertion d'identités pour insérer des enregistrements, vous ne devez PAS avoir d'identité dans la seconde table. – HLGEM