2010-06-28 3 views
0

Savez-vous comment réécrire ces requêtes dans MySQL? Je ne trouve pas d'insertion d'identité, je ne trouve pas d'essayer d'attraper, Je ne comprends pas.MSSQL Essayez Catch et définir l'insertion d'identité dans MySQL?

CREATE TRIGGER T1 ON DB1.dbo.A 
AFTER INSERT AS 

BEGIN TRY 

    SET IDENTITY_INSERT DB2.dbo.B ON 
    INSERT INTO dbo.B(id, text) SELECT A.id,A.text FROM dbo.A INNER JOIN inserted I ON I.id = A.id 
    SET IDENTITY_INSERT DB2.dbo.B OFF 

    SET IDENTITY_INSERT DB2.dbo.D ON  
    INSERT INTO dbo.D(id, text) SELECT A.id,A.text FROM dbo.A INNER JOIN inserted I ON I.id = A.id  
    SET IDENTITY_INSERT DB2.dbo.D OFF 

END TRY 
BEGIN CATCH 

    ROLLBACK TRANSACTION 

    SET IDENTITY_INSERT DB2.dbo.B OFF 
    SET IDENTITY_INSERT DB2.dbo.D OFF 
END CATCH 

GO 
+0

MSSQL (2005+)> MySQL – Dubs

+0

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

Répondre

0

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

0

Définissez simplement la colonne id sur AUTO_INCREMENT. Vous n'avez pas besoin d'activer ou de désactiver quelque chose.

Lire la suite dans documentation

Questions connexes