2014-10-29 43 views
3

我在phpMyAdmin中使用Mysql,我必须从tableA中删除一个条目,如果我插入了具有相同主键的行。我想在tableA的触发器中执行该操作前插入 对于防爆, 如果表A中包含在Mysql中修改表从它自己的触发器 - PhpMyAdmin

1 Hai Hello 

这里1是主键

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

它给人的错误

#1442 - 因为它已经使用由调用 此存储函数/触发语句存储 功能/触发无法更新表“表A”。

所以我改变了我的方式,我从tableA的BEFORE INSERT调用了一个过程,并且在那个过程中我做了我认为在触发器中做的任务。但不幸的是,我得到了同样的错误。 在触发BEFORE INSERT我只是调用的过程作为

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; 

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

+0

你为什么要删除?你想要替换旧数据还是真的删除记录? – Jaylen 2014-10-29 18:11:57

+0

@Mike我想删除旧记录并插入新记录。我只是从.csv文件插入新的值这里旧值不能更新,所以我想在插入前删除它 – user3784251 2014-10-29 18:15:11

回答

2

我不喜欢使用触发器,因为他们很难管理事端。他们也会导致你的表现降级。我不反对触发因为在某些情况下他们可以很方便。

你的情况,你有使用虽然还是REPLACE(....)INSERT INTO .... ON DUPLICATE KEY UPDATE甚至INSERT INTO IGNORE .....

REPLACE(....)将删除记录,如果记录被找到并插入一个新的具有相同ID的。

INSERT INTO .... ON DUPLICATE KEY UPDATE将允许您覆盖现有的字段,如果发现重复。

INSERT INTO IGNORE .....可以让你忽略新插入的行如果已经存在

既然你在,你是从文件导入记录的评论中提到,然后尝试使用LOAD DATA INFILE逻辑,这将让你REPLACE场一式两份

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

抱歉,我不能使用替换查询,因为我需要插入.csv文件的值。我只是直接导入它。 – user3784251 2014-10-29 18:17:39

+0

你如何导入数据?你不能插入忽略? – Jaylen 2014-10-29 18:18:36

+0

实际上,在导入csv文件时,mysql会自动执行正常的'INSERT ...'查询。有没有办法将这个自动查询更改为REPLACE或其他任何你上面说的 – user3784251 2014-10-29 18:20:47