2010-06-28 62 views
0

你知道如何在MySQL中重寫這些查詢嗎? 我無法找到身份插入,我找不到任何嘗試趕上, 我不明白它。MSSQL嘗試在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 2010-06-28 14:44:23

+0

如果您現在正在MSSQL SeErver中執行此操作,那麼您做錯了。這是一種觸發不可行的做法。 Identity uinisert應該只是偶爾使用將舊有記錄移到新位置的dba。 如果您必須打開插入記錄的idntity插入,您不應在第二個表中具有身份。 – HLGEM 2010-06-28 17:22:05

回答

0

MySQL的觸發器具有隱含的事務支持,所以觸發器不能使用顯式或隱式開始或結束交易,如START TRANSACTIONCOMMIT,或ROLLBACK語句。

在MySQL中無需啓用將值插入到主鍵列中 - 這已被允許。你可以,但是,切換外鍵約束檢查和唯一索引檢查:

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

一種常見的方式做,這是存儲在用戶變量的現有值,更改設置,然後恢復你的腳本後設置齊全:

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; 

我不知道爲什麼你需要做的是,在你的觸發,所以你的MySQL觸發器將是這個樣子:

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 ; 

這裏有一個快速測試的結果:

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 | 
+----+--------+ 

如果你想類似的東西TRY ... CATCH,你需要使用處理程序來代替:
http://dev.mysql.com/doc/refman/5.1/en/declare-handler.html

這裏的關於MySQL觸發器的文檔:
http://dev.mysql.com/doc/refman/5.1/en/commit.html

0

只需將id列設置爲AUTO_INCREMENT即可。你不需要打開和關閉某些東西。

閱讀更多documentation