创建表时使用 UNION

Use of UNION when creating tables

数据库-1

create table sample (
  id INT, 
  nm VARCHAR(10)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 
UNION=(for tables from another databases);

那么,当我们做 union 时,它究竟意味着什么? 请解释一下,我对这种 UNION.

感到困惑

这看起来与创建 merge table 的语法很接近,但它的引擎类型有误。您的语句将忽略 union 子句并简单地创建一个新的空 table。为了创建 merge table 您需要指定 ENGINE=MERGE.

14.3 The MERGE Storage Engine

The MERGE storage engine, also known as the MRG_MyISAM engine, is a collection of identical MyISAM tables that can be used as one.

您在 UNION 子句中指定的 tables 必须完全相同 - 即具有相同的索引和列规范,并且它们在每个table.

之后,您能否查询您的合并 table 并访问构成它的所有 table 的数据。

您还可以插入到您的合并中 table,这是您不能使用视图执行的操作:

You can optionally specify an INSERT_METHOD option to control how inserts into the MERGE table take place. Use a value of FIRST or LAST to cause inserts to be made in the first or last underlying table, respectively. If you specify no INSERT_METHOD option or if you specify it with a value of NO, inserts into the MERGE table are not permitted and attempts to do so result in an error.

无论如何,如果你想仔细阅读更多信息,doco 有其余的信息 - 我从来没有觉得需要使用这种类型的 table。

示例:

mysql>
mysql> create table t2 (
    ->   id integer primary key auto_increment,
    ->   val char(20)
    -> ) engine=myisam;
Query OK, 0 rows affected (0.05 sec)

mysql>
mysql> insert into t1(val) values ('table1 a'), ('table1 b');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into t2(val) values ('table2 a'), ('table2 b');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql>
mysql>
mysql> create table mt (
    ->   id integer primary key auto_increment,
    ->   val char(20)
    -> ) engine=merge union=(t1,t2) insert_method=last;
Query OK, 0 rows affected (0.04 sec)

mysql>
mysql> select * from mt;
+----+----------+
| id | val      |
+----+----------+
|  1 | table1 a |
|  2 | table1 b |
|  1 | table2 a |
|  2 | table2 b |
+----+----------+
4 rows in set (0.00 sec)

mysql> insert into mt(val) values ('12345');
Query OK, 1 row affected (0.00 sec)

mysql> select * from mt;
+----+----------+
| id | val      |
+----+----------+
|  1 | table1 a |
|  2 | table1 b |
|  1 | table2 a |
|  2 | table2 b |
|  3 | 12345    |
+----+----------+
5 rows in set (0.01 sec)

mysql> select * from t2;
+----+----------+
| id | val      |
+----+----------+
|  1 | table2 a |
|  2 | table2 b |
|  3 | 12345    |
+----+----------+
3 rows in set (0.00 sec)