MySQL дублировать дочерние данные, когда родитель дублируется - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть 2 таблицы: bases (родительский) и base_formula (дочерний).

Что мне нужно, так это дублирование дочерних данных, когда родительский объект копируется (создается).

Вот моя оценка:

CREATE TABLE `bases` (
  `base_id_pk` int(11) NOT NULL,
  `base_duplicate` int(11) DEFAULT NULL,
  `base_id` int(11) NOT NULL,
  `base_desc` varchar(40) NOT NULL,
  `base_material` int(11) NOT NULL,
  `base_material_percent` varchar(50) DEFAULT NULL,
  `target_sg` decimal(4,3) NOT NULL,
  `base_material_unit` varchar(4) NOT NULL,
  `cost_per_kg` varchar(20) DEFAULT '0',
  `bulk_base_liquid_id` int(11) DEFAULT NULL,
  `micro_sample` tinyint(4) NOT NULL,
  `base_version` varchar(10) NOT NULL,
  `mod_by` varchar(100) DEFAULT NULL,
  `mod_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `change_reason` varchar(200) DEFAULT NULL,
  `superseeds` varchar(100) DEFAULT NULL,
  `department` varchar(150) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `base_formula` (
  `id` int(11) NOT NULL,
  `base_id` int(11) NOT NULL,
  `raw_material_id` varchar(1120) NOT NULL,
  `percent` decimal(7,4) DEFAULT NULL,
  `dispense` int(11) DEFAULT '1',
  `ignore_step` int(11) DEFAULT NULL,
  `main_ingredient` int(5) NOT NULL DEFAULT '0',
  `cost_of_use` decimal(6,3) DEFAULT NULL,
  `active_flag` int(5) DEFAULT NULL,
  `test` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

base_id на base_formula - это FK, связанный с base_id_pk на базах.

У меня есть base_duplicate,это поле, которое я собирался использовать для привязки к родительскому идентификатору, из которого я хотел дублировать дочерние данные.

Я после создания триггера BEFORE INSERT, если это возможно.Мои предыдущие попытки вызвали ошибки MySQL:

CREATE TRIGGER `insert_base_duplication_formula` BEFORE INSERT ON `bases`
 FOR EACH ROW INSERT INTO base_formula(base_id,raw_material_id,percent,dispense,ignore_step,main_ingredient,cost_of_use,active_flag) 
    SELECT 
        NEW.base_id_pk, 
        bf.raw_material_id, 
        bf.percent, 
        bf.dispense, 
        bf.ignore_step,
        bf.main_ingredient, 
        bf.cost_of_use,
        0
    FROM base_formula bf 
    WHERE NEW.base_duplicate IS NOT NULL 
        AND new.base_duplicate=bf.base_id
...