【问题标题】:Identify member table in MySQL MERGE storage engine识别 MySQL MERGE 存储引擎中的成员表
【发布时间】:2011-10-10 10:41:59
【问题描述】:

我们有 MERGE 存储引擎的 MYSQL 表,它合并了 40 个表(“table01”到“table40”)的数据。一旦我们运行一个 SELECT 查询,我们就会从所有合并的 MySQL 表中获取所有条目。 MERGE 表的结构和行为符合预期。

但是碰巧我们需要确定哪个合并表行条目来自或对应于哪个合并表,即

  • rowA => "table01"
  • rowB => "table12"
  • rowC => "table12"
  • rowD => "table35"
  • rowE => "table39"
  • 行... => "表格..."

有没有办法用 MySQL MERGE 存储引擎做到这一点?

【问题讨论】:

    标签: mysql merge


    【解决方案1】:

    不是那么优雅,但您可以在每个表上添加一个标识整数列,将该列指定为默认值 1 ,2 (取决于它是哪个表 - 您甚至可以放入查找表(tableId - -> tableName),然后您应该能够分辨给定行来自哪个表。

    当然,您也必须对 MERGE 表进行相同的更改...

    亲切地撕掉MERGE MySQL docs:

    CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,message CHAR(20)) ENGINE=MyISAM;
    
    CREATE TABLE t2 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,message CHAR(20)) ENGINE=MyISAM;
    
    INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
    INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
    
    CREATE TABLE total (a INT NOT NULL AUTO_INCREMENT,message CHAR(20),INDEX(a)) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
    
    alter table t1 add column identifier int unsigned not null default 1;
    alter table t2 add column identifier int unsigned not null default 2;
    
    drop table total;
    
    CREATE TABLE total (a INT NOT NULL AUTO_INCREMENT,message CHAR(20),identifier int unsigned,INDEX(a)) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
    

    不过,您将面临更改所有 40 个表的相当枯燥的任务...

    【讨论】:

    • 请注意,使用整数而不是字符串通常会提高效率。
    猜你喜欢
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 2018-11-14
    • 2018-06-25
    • 2010-10-11
    相关资源
    最近更新 更多