我是新手,想要一些帮助。我的名字为“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 ;
答案 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以定期删除旧条目。