Вставка данных из таблицы в другую таблицу при срабатывании триггера - PullRequest
0 голосов
/ 18 декабря 2011

У меня есть 4 таблицы:

  1. pacienti
  2. Кабинет
  3. тпм
  4. vizite.

DROP SCHEMA IF EXISTS tr;
CREATE SCHEMA IF NOT EXISTS tr; 
USE tr;
CREATE TABLE IF NOT EXISTS pacienti
( 
   id_pac INT NOT NULL  AUTO_INCREMENT  PRIMARY KEY
   Nume VARCHAR(40) DEFAULT  'anonim',
   Prenume VARCHAR(40) DEFAULT  'anonim',
   UNIQUE (Nume,Prenume)
) ENGINE=INNODB;

CREATE TABLE IF NOT EXISTS cabinete 
(
   id_cab INT  NOT NULL  AUTO_INCREMENT PRIMARY KEY
   Denumire VARCHAR(40) DEFAULT  'nespecificat',
   UNIQUE (Denumire)
) ENGINE=INNODB;

CREATE TABLE IF NOT EXISTS tmp 
(
   id_tmp INT(5) NOT NULL AUTO_INCREMENT PRIMARY KEY,
   DataVizita VARCHAR(10),
   OraIntrare TIME,
   ComplDate DATETIME,
   NumePacient VARCHAR(40) DEFAULT 'anonim',
   PrenumePacient VARCHAR(40) DEFAULT 'anonim',
   NumeMedic VARCHAR(40) DEFAULT 'nespecificat',
   PrenumeMedic VARCHAR(40) DEFAULT 'nespecificat',
   Cabinet VARCHAR(30) DEFAULT 'nespecificat'
);

CREATE TABLE IF NOT EXISTS vizite 
(
   id_viz INT(5) NOT NULL AUTO_INCREMENT PRIMARY KEY,
   Data_viz DATETIME,
   Medic_id INT(5) NOT NULL,
   Pacient_id INT(5) NOT NULL,
   Cabinet_id INT(5) NOT NULL, 
   FOREIGN KEY (`Medic_id`) REFERENCES `tr`.`medici`(`id_med`) 
   ON UPDATE RESTRICT ON DELETE CASCADE,
   FOREIGN KEY (`Pacient_id`) REFERENCES `tr`.`pacienti`(`id_pac`)
   ON UPDATE RESTRICT ON DELETE CASCADE,
   FOREIGN KEY (`Cabinet_id`) REFERENCES `tr`.`cabinete`(`id_cab`)
   ON UPDATE RESTRICT ON DELETE CASCADE
) ENGINE=INNODB;

У меня есть файл, из которого я должен импортировать данные в таблицу tmp. Файл (* .txt) имеет следующие поля:

DataVizita | OraIntrare | NumePacient | PrenumePacient | NumeMedic | PrenumeMedic | Cabinet
--------------------------------------------------------------------------------------------
22/04/2005 | 01:52:34   | Huruiala    |Carmen Alexandra| Garbeata  |  Panait      |   1
05/12/2005 | 04:16:02   | Schornig    |     Petre      | Rusu      | Dragos Mihai |   2
07/11/2004 | 11:24:27   | Graur       |Alexandra-Cris. | Soarece   | Dan-Cristian |   4
07/05/2008 | 06:35:44   | Rudnitchi   |     Marian     | Galescu   |George Valentin|  5
 .
 .
 .
 etc…

ПОСЛЕ / ДО того, как я произвел импорт в таблицу tmp, мне нужно выполнить некоторые операции:

  1. Создайте триггер, который должен concat DataVizita и OraIntrare в поле DATETIME (мне удалось создать функцию, которая преобразует DataVizita в правильный формат и объединяет его с OraIntrare и помещает результат в ComplDate из tmp таблицы.

    Вот что я уже сделал, и это работает:

    CREATE FUNCTION formdate(ziua VARCHAR(10), timpul TIME)RETURNS DATETIME       
    DERMINISTIC    
    RETURN 
     CONCAT (DATE_FORMAT(STR_TO_DATE(ziua, '%d/%m/%Y' ) , '%Y-%m-%d' ),' ',timpul);
    
    DELIMITER $$
    CREATE TRIGGER upd_date BEFORE INSERT ON tmp
    FOR EACH ROW
    BEGIN
          SET new.ComplDate = formdate(new.DataVizita,new.OraIntrare);
    END$$
    DELIMITER ;
    
  2. Второе, что мне нужно сделать, это заполнить таблицы pacienti и cabinete данными из этого файла.

И этот мне нужен, потому что я не могу понять, как это сделать: (

Извините за эту длинную презентацию, но я думал, что кому-то понадобятся все детали, чтобы понять мой вопрос.

1 Ответ

0 голосов
/ 25 декабря 2011

Я понял, что на самом деле это очень просто :).Последний триггер должен выглядеть следующим образом:

DROP TRIGGER IF EXISTS upd_date;

DELIMITER $$

CREATE TRIGGER upd_date BEFORE INSERT ON tmp
FOR EACH ROW 
BEGIN

  SET new.ComplDate=formdate(new.DataVizita,new.OraIntrare);

  INSERT INTO pacienti(nume,prenume) VALUES(new.NumePacient,new.PrenumePacient)
  ON DUPLICATE KEY UPDATE nume=new.NumePacient, prenume=new.PrenumePacient;

  INSERT INTO cabinete(Denumire) VALUES(new.Cabinet)
  ON DUPLICATE KEY UPDATE Denumire=new.Cabinet;


END$$

DELIMITER ;

Надеюсь, это кому-то помогло!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...