O gatilho do MySQL realiza a separação de dados em tempo real e dados históricos
No projeto de banco de dados, muitas vezes é necessário separar os dados em tempo real dos dados históricos, de modo a garantir a pontualidade dos dados em tempo real, ao mesmo tempo em que retém os dados históricos para retrocesso e análise. Este artigo descreve como usar um gatilho MySQL (gatilho) para separar dados em tempo real de dados históricos e definir a tabela em tempo real para reter apenas os dados mais recentes.
Projeto de tabela em tempo real e tabela de histórico
Ao projetar tabelas de banco de dados, geralmente armazenamos dados em tempo real em uma tabela e dados históricos em outra. Fazer isso pode reduzir o volume de dados de uma única tabela e melhorar a eficiência da consulta.
Tomamos a tabela de usuários como exemplo e projetamos duas tabelas: tabela de tempo real (user_realtime) e tabela de histórico (user_history). Entre eles, a tabela em tempo real mantém apenas os dados mais recentes do usuário, e a tabela de histórico salva todos os dados do usuário e registra o tempo de modificação.
A estrutura da tabela de tempo real é a seguinte:
CREATE TABLE user_realtime (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT NOT NULL,
PRIMARY KEY (id)
);
A estrutura da tabela de histórico é a seguinte:
CREATE TABLE user_history (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT NOT NULL,
modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
Implementação do gatilho
Precisamos definir um gatilho de inserção na tabela de tempo real. Sempre que novos dados forem inseridos, o gatilho inserirá os dados na tabela de histórico e excluirá os dados antigos da tabela de tempo real. Isso garante que apenas os dados mais recentes estejam na tabela ativa.
O código para inserir a trigger é o seguinte:
CREATE TRIGGER insert_user_realtime AFTER INSERT ON user_realtime
FOR EACH ROW
BEGIN
-- 插入历史表
INSERT INTO user_history(name, age) VALUES (NEW.name, NEW.age);
-- 删除老数据
DELETE FROM user_realtime WHERE id <> NEW.id;
END;
alcançar resultados
Agora vamos testar a implementação do gatilho.
Primeiro, insira um dado na tabela em tempo real:
INSERT INTO user_realtime(name, age) VALUES ('Tom', 20);
Há apenas um dado na tabela em tempo real:
SELECT * FROM user_realtime;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | Tom | 20 |
+----+------+-----+
Há também um dado na tabela de histórico:
SELECT * FROM user_history;
+----+------+-----+---------------------+
| id | name | age | modified_time |
+----+------+-----+---------------------+
| 1 | Tom | 20 | 2021-12-31 15:00:00 |
+----+------+-----+---------------------+
Agora insira um novo dado e modifique os dados originais:
INSERT INTO user_realtime(name, age) VALUES ('Jerry', 25);
UPDATE user_realtime SET age = 22 WHERE id = 1;
Há apenas uma parte dos dados mais recentes na tabela em tempo real:
SELECT * FROM user_realtime;
+----+-------+-----+
| id | name | age |
+----+-------+-----+
| 2 | Jerry | 25 |
+----+-------+-----+
Existem dois dados na tabela de histórico, um dos dados originais e um dos dados modificados:
SELECT * FROM user_history;
+----+------+-----+---------------------+
| id | name | age | modified_time |
+----+------+-----+---------------------+
| 1 | Tom | 20 | 2021-12-31 15:00:00 |
| 2 | Tom | 22 | 2021-12-31 15:01:00 |
+----+------+-----+---------------------+
Resumir
Este artigo descreve como usar gatilhos MySQL para separar dados em tempo real de dados históricos e definir a tabela em tempo real para reter apenas os dados mais recentes.
Em aplicações práticas, as tabelas podem ser projetadas de acordo com as necessidades de negócios e os gatilhos podem ser usados para separar dados e reter dados históricos, melhorando assim a eficiência da consulta e análise de dados.