如何使用触发器更新表

时间:2014-12-02 08:07:22

标签: mysql

我是新手,想要一些帮助。我的名字为“abc”,表格如下

+------+--------+------+
| Id   | Name   | City |
+------+--------+------+
|  101 | john   | abc  |
|  102 | Miller | cbz  |
+------+--------+------+

和另一张表“xyz”

+------+--------+------+
| Id   | Name   | City |
+------+--------+------+
|  102 | Miller | cbz  |
+------+--------+------+

我在表“abc”上应用了触发器,它将使用最近插入的值更新表“xyz”,并将删除所有以前的条目... 例如,当我在“abc”表上触发插入查询时,我得到“abc”,如下所示

  insert into abc Values(103,'Joseph','xyz');

我得到表“abc”的输出为,

 +------+--------+------+
 | Id   | Name   | City |
 +------+--------+------+
 |  101 | john   | abc  |
 |  102 | Miller | cbz  |
 |  103 | Joseph | xyz  |
 +------+--------+------+

和表“xyz”as,

  +------+--------+------+
  | Id   | Name   | City |
  +------+--------+------+
  |  103 | Joseph | xyz  |
  +------+--------+------+

现在我的问题是如何仅使用一个表来实现这一点(我不想使用两个表,因为这不是我的要求)。 喜欢以下..

    insert into xyz values(104,'Ridhit','pqr');

  +------+--------+------+
  | Id   | Name   | City |
  +------+--------+------+
  |  104 | Ridhit | pqr  |
  +------+--------+------+

请帮助。我使用的触手是

  DELIMITER !!
  create trigger OnlyOne BEFORE INSERT on abc
  for each row
  BEGIN
  DECLARE a1 INT;
      Select count(1) INTO a1 from xyz;
   IF a1>0 THEN
    delete from xyz limit 1;
    insert into xyz(Id,Name,City) values (new.Id,new.Name,new.City);
   ELSE
    insert into xyz(Id,Name,City) values (new.Id,new.Name,new.City);
   END IF;
   END;
   !!
   DELIMITER ;

1 个答案:

答案 0 :(得分:0)

在应用程序级别执行此操作,但最好确保使用transactions。当操作在中间崩溃时,你可能不想要一个空表。

您也可以考虑采用以下方法。

不是在发生插入时删除/更新,而是向表中添加一个使用当前时间戳的默认值创建的列,使其看起来像这样:

CREATE TABLE abc(
id int auto_increment primary key,
name varchar(50),
city varchar(50),
created timestamp default current_timestamp
);

要获得最新的条目

SELECT * FROM abc ORDER BY created DESC LIMIT 1;

或者你把它放在视图中

CREATE VIEW just_latest_entry_from_abc AS
SELECT * FROM abc ORDER BY created DESC LIMIT 1;

然后你就做了

SELECT * FROM just_latest_entry_from_abc;

当表格大小很重要时,请创建一个cronjob或scheduled event以定期删除旧条目。