Bisakah saya memiliki satu tabel menjadi "alias", atau "symlink", ke yang lain?


10

Saya memiliki dua tabel dengan struktur yang sama, A dan B. Aplikasi tertentu ditulis sehingga selalu menulis data yang sama untuk kedua tabel.

Setelah berdiskusi dengan seorang kolega tentang potensi untuk menghemat ruang drive, saya bertanya-tanya apakah mysql atau postgresql memiliki kemampuan untuk membuat di atas meja sebagai "alias", atau "symlink", dari yang lain.

Saya ingin perilaku sangat mirip dengan symlink file lunak; di mana membaca dari symlink itu sendiri atau targetnya akan menghasilkan output yang sama, dan menulis ke salah satu akan memperbarui target.


2
Sudahkah Anda mempertimbangkan tampilan tabel?

Di SQL Server Anda bisa menggunakan tampilan.
— JNK

1
RDBMS yang mana? Anda telah menandai MySQL dan Postgres. Tampilan akan berfungsi di sebagian besar RDBMSes. Oracle memiliki sinonim, yang sama dengan tautan simbolis Unix
— Philᵀᴹ

MySQL dan Postgres, ya. Saya menyebutkannya secara khusus dalam teks juga. Saya pikir Tampilan entah bagaimana tidak cukup apa yang saya cari, tapi mungkin itu akan baik-baik saja. Terima kasih banyak. Posting beberapa jawaban :)
— user50849

1
dan mengapa Anda membutuhkan dua tabel?
— miracle173

Jawaban:


5

Sejauh yang saya tahu, Postgresql baru memungkinkan Anda memiliki INSTEAD OFpemicu pada tampilan. Jadi memiliki satu meja, satu tampilan sebagai SELECT * FROM table1, dan INSTEAD OFpemicu insert, update, deleteharus bekerja untuk Anda. Pendekatan ini tidak akan bekerja di Mysql


2

Dimungkinkan di MySQL (hanya menggunakan mesin penyimpanan MyISAM) untuk membuat tabel dari awal menggunakan symlink. Itu ada di Linux dan Windows (menggunakan hardlink):

Inilah posting saya yang lalu tentang hal ini

Namun, apa yang Anda usulkan harus dilakukan di luar MySQL di Linux.

Untuk contoh ini

  • / var / lib / mysql adalah datadir
  • Buat table1 sebagai tabel MyISAM di database mydb
  • Buat table2 sebagai symlink murni ke table1

LANGKAH 01) Buat tabel1

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

LANGKAH 02) Buat tiga symlink untuk meniru TableB

cd /var/lib/mysql/mydb
ln -s table1.frm table2.frm
ln -s table1.MYD table2.MYD
ln -s table1.MYI table2.MYI

LANGKAH 03) Coba masukkan ke table1 dan baca dari table2. Kemudian coba sebaliknya.

INSERT INTO table1 (mydata) VALUES ('rolando'),('edwards');
SELECT * FROM table2;
INSERT INTO table2 (mydata) VALUES ('abraham'),('lincoln');
SELECT * FROM table1;

Jika semuanya berperilaku normal, maka ini adalah bagaimana Anda dapat melakukan ini.

CAVEAT

  1. Hanya ada satu tabel, table1
  2. Jika Anda melakukan DDL
    • Lakukan DDL pada table1
    • Anda harus membuat ulang symlinks table2 setelah DDL terhadap table1
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.