2014-12-02 31 views
0

我是新来的这一点,并希望一些help.i有名字“ABC”表以下条目如何使用触发

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

和另一个表“XYZ”

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

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

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

我得到表 “ABC” 输出,

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

和表 “XYZ” 是,

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

现在我的问题是如何只使用一个表来达致这(我不想使用两张表,因为这不是我的要求)。 像下面..

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

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

请help.Trigger我使用的是

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 ; 
+0

你的意思是你会在'xyz'上插入,它会在添加新的之前删除先前的条目?如果是这样,这是不可能的触发器。你不能在触发完成的同一张表上插入/更新/删除。 – 2014-12-02 08:12:32

+0

ohh:(...所以任何其他解决方案...? – SimplyMe 2014-12-02 08:14:14

+1

可能你需要在应用程序级别内完成 – 2014-12-02 08:17:09

回答

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; 

然后你只需做

​​

当表的大小事务,创建一个cronjob或scheduled event以定期删除旧条目。

+0

同意你的解决方案,但这只会给最后一个条目...如果用户插入多个条目......? – SimplyMe 2014-12-02 09:58:15

+1

然后使用第一种解决方案,但使用事务。 – fancyPants 2014-12-02 10:09:03

+0

好的......谢谢你的努力...... :) – SimplyMe 2014-12-02 10:22:51