2014-12-02 5 views
0

Я новичок в этом и хочу, чтобы некоторый help.I есть таблица с именем «ABC» со следующими записямикак обновить таблицу с помощью триггера

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

и другая таблица «А»

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

я применил триггер в таблице «abc», который обновит таблицу «xyz» с недавно вставленными значениями и удалит все предыдущие записи ... , например, когда i fire insert query на таблице «abc» я получаю, «abc» as следовать

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

я получить выход для таблицы «ABC», как,

+------+--------+------+ 
| Id | Name | City | 
+------+--------+------+ 
| 101 | john | abc | 
| 102 | Miller | cbz | 
| 103 | Joseph | 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» и он удалит предыдущую запись перед добавлением нового? Если так, это невозможно с триггером. Вы не можете вставлять/обновлять/удалять в той же таблице, где запускается триггер. –

+0

ohh: (... так что любое другое решение ...? – SimplyMe

+1

Может быть, вам нужно сделать это на уровне приложения. –

ответ

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, чтобы удалить старые записи на регулярной основе.

+0

согласен с вашим решением, но это даст только последнюю запись ... что если, если пользователь вставляет несколько записей ...? – SimplyMe

+1

Затем перейдите к первому решению, но используйте транзакции. – fancyPants

+0

ладно ... спасибо за ваши усилия ... :) – SimplyMe