首页 > 解决方案 > 如何从不同的表中获取 MySQL 中最后插入的行?

问题描述

我的数据库中有很多不同的表,我需要以某种方式从这些表中获取最后插入的行。就像社交网络提要一样。此外,这些表的名称不是随机的,而是未知的,因为它们都是由用户生成的。

例如:我有表:A、B、C 和 D,每个表中有 5k 行。我需要以某种方式从这些表中获取最后一行并使其排序id,就像我们在一个简单的查询中所做的那样:"SELECT * FROM table A ORDER BY id DESC",但我正在寻找类似的东西:"SELECT * FROM A,B,C,D ORDER BY id DESC"

表具有相同的结构。

标签: mysql

解决方案


如果每个表的 id 单独计算,则不能按 ID 排序,因此您需要计算全局 id 并在所有表上使用它。

你可以这样做:

假设您有 2 个表 A,B:

Create Table A(id int NOT NULL auto_increment, name varchar(max), value varchar(max), PRIMARY_KEY(id));
Create Table B(id int NOT NULL auto_increment, name varchar(max), value varchar(max), PRIMARY_KEY(id));

添加另一个以 id 作为自动增量主键的表 IDS。

Create table IDS (id  int NOT NULL auto_increment, ts Timestamp default CURRENT_TIMESTAMP, PRIMARY_KEY(id));

对于所有表的 id 列,现在应该使用 IDS 表中的 id 作为外键,而不是自动递增。

Create Table A(id int NOT NULL auto_increment, name varchar(max), value varchar(max), PRIMARY_KEY(id),CONSTRAINT fk_A_id FOREIGN KEY(id) REFERENCE IDS(id) ON DELETE CASCADE ON UPDATE CASCADE);
Create Table B(id int NOT NULL auto_increment, name varchar(max), value varchar(max), PRIMARY_KEY(id),CONSTRAINT fk_A_id FOREIGN KEY(id) REFERENCE IDS(id) ON DELETE CASCADE ON UPDATE CASCADE);

对于在插入触发器之前添加的每个表,触发器应首先向 IDS 表插入行并插入LAST_INSERT_ID该表。

Create TRIGGER befor_insert_A BEFORE INSERT On A 
FOR EACH ROW
BEGIN
  insert into IDS() values ();
  set new.id = LAST_INSERT_ID();
END

Create TRIGGER befor_insert_B BEFORE INSERT On B 
FOR EACH ROW
BEGIN
  insert into IDS() values ();
  set new.id = LAST_INSERT_ID();
END

现在您可以使用 union all 从所有表创建视图,v 的行现在可以按 id 排序并给出插入的 cronlogic 顺序。

Create view V AS select * from A UNION ALL select * from B

例如,您可以在 V 上查询最新的 10 个 id:

select * from V Order by id desc LIMIT 10

其他选项是为每个表添加时间戳并按时间戳对视图进行排序。


推荐阅读