Триггер «До вставки» и «После обновления» на той же таблице не работает должным образом - PullRequest
0 голосов
/ 12 марта 2020

Уважаемый господин, у меня есть мастер-таблица tbl_appli_basic_info для этой таблицы. Я создал два типа триггера, один после вставки, а другой - перед триггером обновления. Я вставляю первую запись в основную таблицу, значит, когда первичный ключ равен единице, она вставляет запись в основную таблицу. Перед вставкой триггера вставьте запись в tbl_appli_basic_info_after_insert, которую я создаю отдельно. Во-вторых, когда я обновляю первичный ключ, одна запись, скажем, в основной таблице, я вставляю имя, т. Е. Ab, теперь я обновляю его до ab c, после триггера обновления вставляю данные в другую таблицу, т.е. данные дважды говорят, что имя ab c, теперь я изменил его abcxzy, он не позволил мне обновить запись. Моя основная цель использования после триггера вставки состоит в том, чтобы поддерживать запись, как только она вставляется в основную таблицу, после этого я не использую эту таблицу. триггер после обновления ведет учет одного пользователя, сколько раз я обновляю записи в разных строках. Я не могу манипулировать кодом, пожалуйста, исправьте мой код. Я буду вам полон.

DROP TABLE IF EXISTS `tbl_appli_basic_info`;
CREATE TABLE IF NOT EXISTS `tbl_appli_basic_info` (
  `appli_basic_info_id` int(22) NOT NULL AUTO_INCREMENT,
  `apli_reg_no` int(22) NOT NULL,
  `full_name` varchar(256) NOT NULL,
  PRIMARY KEY (`appli_basic_info_id`),
  KEY `apli_reg_no` (`apli_reg_no`)
);

CREATE TABLE IF NOT EXISTS `tbl_appli_basic_info_after_insert` (
  `appli_basic_info_id` int(22) NOT NULL AUTO_INCREMENT,
  `apli_reg_no` int(22) NOT NULL,
  `full_name` varchar(256) DEFAULT NULL,
  PRIMARY KEY (`appli_basic_info_id`),
  KEY `apli_reg_no` (`apli_reg_no`)
) ;

CREATE TABLE IF NOT EXISTS `tbl_appli_basic_info_after_update` (
  `appli_basic_info_id` int(22) NOT NULL AUTO_INCREMENT,
  `apli_reg_no` int(22) NOT NULL,
  `full_name` varchar(256) NOT NULL,
  PRIMARY KEY (`appli_basic_info_id`)
);

DROP TRIGGER IF EXISTS `trg_appli_basic_info_after_insert`;
DELIMITER $$
CREATE TRIGGER `trg_appli_basic_info_after_insert` AFTER INSERT ON `tbl_appli_basic_info` FOR EACH ROW BEGIN
  -- Insert record into tbl_appli_basic_info_after_insert table
   INSERT INTO tbl_appli_basic_info_after_insert
   ( appli_basic_info_id,
     apli_reg_no,
     full_name)
   VALUES
   ( NEW.appli_basic_info_id,
     NEW.apli_reg_no,
     NEW.full_name
     );

END
$$
DELIMITER ;
DROP TRIGGER IF EXISTS `trg_appli_basic_info_before_update`;
DELIMITER $$
CREATE TRIGGER `trg_appli_basic_info_before_update` BEFORE UPDATE ON `tbl_appli_basic_info` FOR EACH ROW BEGIN

   -- Insert record into audit table
   INSERT INTO tbl_appli_basic_info_before_update
   ( appli_basic_info_id,
     apli_reg_no,
     full_name
   )
   VALUES
   ( NEW.appli_basic_info_id,
     NEW.apli_reg_no,
     NEW.full_name

   );

END
$$
DELIMITER ;

1 Ответ

0 голосов
/ 12 марта 2020

Ваши определения таблицы аудита не имеют большого смысла, и поскольку вы определяете appli_basic_info_id int (22) NOT NULL AUTO_INCREMENT Первичный ключ и перезаписываете его в триггерах, таким образом, я ожидаю повторения ошибок ключа. Я бы изменил определения таблиц на

CREATE TABLE IF NOT EXISTS `tbl_appli_basic_info_after_insert` (
  id int auto_increment primary key,
  `appli_basic_info_id` int(22) ,
  `apli_reg_no` int(22) NOT NULL,
  `full_name` varchar(256) DEFAULT NULL,
  PRIMARY KEY (id),
  KEY `apli_reg_no` (`apli_reg_no`)
) ;

CREATE TABLE IF NOT EXISTS `tbl_appli_basic_info_after_update` (
   id int auto_increment primary key,
  `appli_basic_info_id` int(22) NOT NULL ,
  `apli_reg_no` int(22) NOT NULL,
  `full_name` varchar(256) NOT NULL,
  PRIMARY KEY (id)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...