【问题标题】:modify the table from its own trigger in Mysql- PhpMyAdmin从 Mysql-PhpMyAdmin 中自己的触发器修改表
【发布时间】:2014-12-25 13:59:34
【问题描述】:

我在 phpMyAdmin 中使用 Mysql,如果我插入具有相同主键的行,我必须从 tableA 中删除一个条目。我想在插入之前在 tableA 的触发器中执行它 例如, 如果 tableA 包含

1 Hai Hello

这里 1 是主键

现在如果我插入一行 1 Bye Hello 然后触发器 BEFORE INSERT 将删除旧条目,然后插入新行(第 2 行)。但是 Mysql 的限制是不能更新为同一个表定义的触发器内的表。

它给出了错误

#1442 - 无法更新存储的表 'tableA' 函数/触发器,因为它已被调用的语句使用 这个存储的函数/触发器。

所以我改变了我的方式,我在插入 tableA 之前从触发器中调用了一个过程,并且在那个过程中我完成了我认为在触发器中要做的任务。但不幸的是,我遇到了同样的错误。 在插入之前的触发器中,我简单地将过程称为

CALL proce1(new.Reg_No);

在程序中我已经这样做了

DECLARE toup integer;
    select count(*) into toup from tableA where Reg_No=reg;/*Here Reg_No is primary key */
        if toup > 0 then
     delete from tableA where Reg_No=reg;
    end if;

需要一些其他的想法来实现这一点。帮帮我.....

【问题讨论】:

  • 你为什么要删除?您是要替换旧数据还是真的删除记录?
  • @Mike 我想删除旧记录并插入新记录。我只是从 .csv 文件中插入新值,旧值无法更新,所以我想在插入之前删除它

标签: mysql sql stored-procedures triggers phpmyadmin


【解决方案1】:

我不太喜欢使用触发器,因为它们有时很难管理。它们还会导致您的性能下降。我不反对触发器,因为它们在某些情况下很方便。

在您的情况下,您是否考虑过使用REPLACE(....)INSERT INTO .... ON DUPLICATE KEY UPDATE 甚至INSERT INTO IGNORE .....

REPLACE(....) 将在找到记录时删除记录并插入具有相同 ID 的新记录。

INSERT INTO .... ON DUPLICATE KEY UPDATE 将允许您在发现重复项时覆盖现有字段。

INSERT INTO IGNORE ..... 将允许您忽略新插入的行(如果已存在)

由于您在 cmets 中提到您正在从文件中导入记录,因此请尝试使用 LOAD DATA INFILE 逻辑,这将允许您重复 REPLACE 字段

LOAD DATA LOCAL INFILE 'x3export.txt'
REPLACE INTO TABLE x3export

【讨论】:

  • 抱歉,我不能使用替换查询,因为我需要插入 .csv 文件中的值。我直接导入了。
  • 如何导入数据?你不能插入忽略吗?
  • 实际上在导入 csv 文件时,mysql 只会自动执行普通的INSERT... 查询。有什么办法可以将此自动查询更改为 REPLACE 或您上面所说的任何其他内容
  • 其实如果我明确写出来,REPLACE 会给出答案。
  • 你是如何导入数据的?
猜你喜欢
  • 2011-09-24
  • 1970-01-01
  • 2011-11-16
  • 2011-07-10
  • 2020-07-09
  • 2013-11-26
  • 2015-10-16
  • 2015-12-02
  • 1970-01-01
相关资源
最近更新 更多