【问题标题】:MySQL - How to create a child record under table2 whenever table1 is having a new record using MySQL workbench?MySQL - 每当 table1 使用 MySQL 工作台有新记录时,如何在 table2 下创建子记录?
【发布时间】:2012-03-16 17:50:41
【问题描述】:

实际触发。但是我如何在 mysql-workbench 中做到这一点。这样每当我在table1 中有任何新记录时,它都会创建一个引用table1.idtable2.parentid 的新记录?

--- [OK] --- This is created
CREATE  TABLE IF NOT EXISTS `test`.`table1` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(45) NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB

--- [FAIL] --- #1005 - Can't create table 'test.table2' (errno: 150)
CREATE  TABLE IF NOT EXISTS `test`.`table2` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT ,
  `parentid` VARCHAR(45) NULL ,
  `table1_id` BIGINT(20) NOT NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `fk_table2_table1` (`parentid` ASC) ,
  CONSTRAINT `fk_table2_table1`
    FOREIGN KEY (`parentid` )
    REFERENCES `test`.`table1` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

跟进:

1) Mysql 工作台不提供该功能

2)点击table1>点击触发器标签底部>写入

-- trigger module initiate
DELIMITER $$
CREATE TRIGGER triggertest1 BEFORE INSERT ON table1
  FOR EACH ROW BEGIN
    INSERT INTO table2 SET parentid = NEW.id; 
  END;
$$
DELIMITER ; --- return to normal

【问题讨论】:

    标签: mysql sql triggers foreign-keys mysql-workbench


    【解决方案1】:

    那是因为您的子表中 id 列的数据类型不同,将其更改为 BIGINT(20)

    【讨论】:

    • 为什么在我的触发器中我总是NEW.id ==0 ? table2.parentid 总是显示 0。
    • 原因很简单,您的触发器在插入父表之前触发,因此由于尚未插入数据,因此它不会找到任何 id。将触发器更改为 AFTER INSERT ON
    猜你喜欢
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2020-08-14
    相关资源
    最近更新 更多