插入新行表1复制到表2选定字段后mysql触发器没有重复

Posted

技术标签:

【中文标题】插入新行表1复制到表2选定字段后mysql触发器没有重复【英文标题】:mysql trigger after insert new line table1 copy to table2 selected fields without duplicates 【发布时间】:2019-08-04 10:01:49 【问题描述】:

我想在 TABLE1 上插入新行后创建触发器,并在更新 table1 时创建更新触发器。

我有 2 张桌子。

插入 table1 信息后,我想触发将一些数据复制到 table2 上的新行。 (在这种情况下,F 和 G 将为 null,并且 id2 自动递增。)

id1、A、B、C、D、E = 是 table1 列。 id2、id1、C、E、F、G = 是 table2 列。 id1 和 id2 是每个表的主键

TABLE1(id1, A, B, C, D, E)

TABLE2(id2, id1, C, F, G)

CREATE TABLE Table1(id1 INT, A VARCHAR(10), B VARCHAR(10), C date), D VARCHAR(10), E VARCHAR(10));                                      

CREATE TABLE Table2(id2 INT, C2 date, F VARCHAR(10), G VARCHAR(10));            

GO
CREATE TRIGGER Table1_AfterInsert
    AFTER INSERT ON Table1
    FOR EACH ROW BEGIN

    UPDATE Table2
    SET C2 = NEW.C
    WHERE id1 = NEW.id2;
END;
GO
INSERT INTO Table2(id2, F,G)VALUES(1,'111','red');
INSERT INTO Table2(id2, F,G)VALUES(2,'222','blue');
INSERT INTO Table2(id2, F,G)VALUES(3,'333','red');
GO
INSERT INTO Table1(id1, C)VALUES(1,'AAA'),(2,'BBB');
GO
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
GO
CREATE TRIGGER Table1_AfterUpdate
    AFTER UPDATE ON Table1
    FOR EACH ROW BEGIN

    IF (OLD.C != NEW.C2)
    THEN
      UPDATE Table2
      SET C2 = NEW.C
      WHERE id2 = NEW.id1;
    END IF;
END;
GO
UPDATE TableA

目前,如果我删除每一行,我会将所有行复制到 table2。 当我尝试为每一行添加时,就会出现错误。

这是我的真实表我在第 7 行附近出现错误 #1064 SINTAX

  CREATE TABLE man_value(id (PK), nome_documento VARCHAR(10), descricao VARCHAR(10), data_fim date, data_inicio date, color VARCHAR(10), quem_fim VARCHAR(10), quem_inicio VARCHAR(10));                                        

    CREATE TABLE calendar(id (PK),id_man INT, end_date date, tiltle VARCHAR(10), description VARCHAR(10), color VARCHAR(10), created_by VARCHAR(10), create_at (datetime));         

    ------------------------------------------------------------------------------------------- THIS ONE IS WORKING OK
   DELIMITER $$

CREATE TRIGGER man_value_calendar_AfterInsert
    AFTER INSERT ON man_value
    FOR EACH ROW BEGIN


      INSERT INTO calendar (id_man, title, end_date, description, color,create_by)
  VALUES (NEW.id, NEW.nome_documento, NEW.data_fim,NEW.descricao, '#FFD700',NEW.quem_fim);

END$$

DELIMITER ;

    -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- NO ERROR BUT DOES NOTHING

DELIMITER $$
CREATE TRIGGER man_value_calendar_AfterUpdate
    AFTER UPDATE ON man_value
    FOR EACH ROW BEGIN

    IF (OLD.id = NEW.id)
    THEN
      UPDATE calendar
      SET id_man=NEW.id, title = NEW.nome_documento, end_date=NEW.data_fim, description=NEW.descricao, color='#FFD700', create_by=NEW.quem_fim
      WHERE id_man = NEW.id;
    END IF;
END$$

DELIMITER ;

【问题讨论】:

错误是什么? 未经测试,但我相信它会是这样的。我在问,因为我以前从未做过,所以不确定是否有更容易或更好的方法。我尝试了之前的代码,它复制了所有表格行,而不仅仅是插入的新行。 插入后工作正常。在 SET sintax 上更新 sintax 错误后不确定 【参考方案1】:

已解决

CREATE TABLE man_value(id (PK), nome_documento VARCHAR(10), descicao VARCHAR(10), data_fim 日期, data_inicio 日期, color VARCHAR(10), quem_fim VARCHAR(10), quem_inicio VARCHAR(10));

CREATE TABLE calendar(id (PK),id_man INT, end_date date, tiltle VARCHAR(10), description VARCHAR(10), color VARCHAR(10), created_by VARCHAR(10), create_at (datetime));         

    ---------------------------------
   DELIMITER $$

CREATE TRIGGER man_value_calendar_AfterInsert
    AFTER INSERT ON man_value
    FOR EACH ROW BEGIN


      INSERT INTO calendar (id_man, title, end_date, description, color,create_by)
  VALUES (NEW.id, NEW.nome_documento, NEW.data_fim,NEW.descricao, '#FFD700',NEW.quem_fim);

END$$

DELIMITER ;

    -- -- -- -- -- -- -- -- --

DELIMITER $$
CREATE TRIGGER man_value_calendar_AfterUpdate
    AFTER UPDATE ON man_value
    FOR EACH ROW BEGIN

    IF (OLD.id = NEW.id)
    THEN
      UPDATE calendar
      SET id_man=NEW.id, title = NEW.nome_documento, end_date=NEW.data_fim, description=NEW.descricao, color='#FFD700', create_by=NEW.quem_fim
      WHERE id_man = NEW.id;
    END IF;
END$$

DELIMITER ;

【讨论】:

以上是关于插入新行表1复制到表2选定字段后mysql触发器没有重复的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个 Postgres 11 触发器函数,该函数在插入或更新到表“a”时在表“b”中插入一个新行?

mysql insert语句注意啥

如何在 MySQL 中使用自动增量字段复制行并插入到同一个表中?

Mysql - 创建触发器以根据插入另一个表中的行插入新行

在插入新行之前删除行[重复]

插入后使用 SQL Server 触发器更新另一个表中的列