我可以让一张表成为另一个表的“别名”或“符号链接”吗?

use*_*849 10 mysql postgresql

我有两个结构相同的表,A 和 B。编写了某个应用程序,以便它始终将相同的数据写入两个表。

在与同事讨论节省驱动器空间的潜力后,我想知道 mysql 或 postgresql 是否能够在表上创建另一个表的“别名”或“符号链接”。

我希望行为与软文件符号链接的行为非常相似;从符号链接本身或其目标读取将产生相同的输出,写入任一将更新目标。

a1e*_*x07 5

据我所知,一个新的 Postgresql 可以让你INSTEAD OF在视图上有触发器。因此,拥有一张表、一个视图 asSELECT * FROM table1INSTEAD OF触发器insert, update, delete应该适合您。虽然这种方法在 Mysql 中不起作用


Rol*_*DBA 2

在 MySQL 中(仅使用 MyISAM 存储引擎)可以使用符号链接从头开始创建表。在 Linux 和 Windows 中这是可能的(使用硬链接):

这是我过去关于这个主题的帖子

但是,您所建议的操作必须在 Linux 中的 MySQL 之外完成。

对于这个例子

  • /var/lib/mysql 是数据目录
  • 在数据库 mydb 中创建 table1 作为 MyISAM 表
  • 创建 table2 作为 table1 的纯符号链接

步骤01) 创建表1

CREATE TABLE mydb.table1
(
    id int not null auto_increment,
    mydata varchar(255) not null,
    primary key (id)
) ENGINE=MyISAM;
Run Code Online (Sandbox Code Playgroud)

步骤 02) 创建三个符号链接来模仿 TableB

cd /var/lib/mysql/mydb
ln -s table1.frm table2.frm
ln -s table1.MYD table2.MYD
ln -s table1.MYI table2.MYI
Run Code Online (Sandbox Code Playgroud)

步骤 03) 尝试插入表 1 并从表 2 中读取。然后尝试相反的做法。

INSERT INTO table1 (mydata) VALUES ('rolando'),('edwards');
SELECT * FROM table2;
INSERT INTO table2 (mydata) VALUES ('abraham'),('lincoln');
SELECT * FROM table1;
Run Code Online (Sandbox Code Playgroud)

如果一切正常,那么您就可以这样做。

警告

  1. 只有一张表,table1
  2. 如果您执行任何 DDL
    • 对表1执行DDL
    • 您必须在针对 table1 执行 DDL 之后重新创建 table2 符号链接