MSSQL Попробуйте поймать и установить вставку идентичности в MySQL?

0

Вы знаете, как переписать этот запрос в MySQL? Я не могу найти вставку Identity, я не могу найти попытку поймать, Я этого не понимаю.

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
  • 0
    Если вы делаете это прямо сейчас в MSSQL SeErver, то вы делаете это неправильно. Это недопустимая практика в триггере. Идентификация uinisert должна использоваться только для очень редкого использования базы данных, которая перемещает устаревшие записи в новое место. Если вам нужно включить вставку idntity для вставки записей, у вас НЕ должно быть идентификатора во второй таблице.
Теги:
tsql

2 ответа

0
Лучший ответ

Триггеры MySQL имеют неявную поддержку транзакций, поэтому триггер не может использовать операторы, которые явно или неявно начинают или заканчивают транзакцию, такую ​​как START TRANSACTION, COMMIT или 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

Обычный способ сделать это - сохранить существующие значения в пользовательских переменных, изменить настройки, а затем восстановить настройки после завершения script:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;

-- Your SQL statements here.

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_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. Вам не нужно включать и выключать что-то.

Подробнее в документация

Ещё вопросы

Сообщество Overcoder
Наверх
Меню