Posso avere una tabella come "alias" o "collegamento simbolico" a un'altra?


10

Ho due tabelle con la stessa struttura, A e B. Viene scritta una determinata applicazione in modo che scriva sempre gli stessi dati su entrambe le tabelle.

Dopo una discussione con un collega sul potenziale per risparmiare spazio su disco, mi chiedo se mysql o postgresql abbiano la capacità di creare sul tavolo come un "alias", o "collegamento simbolico", di un altro.

Voglio che il comportamento sia molto simile a quello di un symlink di file soft; dove la lettura dal link simbolico stesso o dal suo target produrrà lo stesso output e la scrittura in entrambi aggiornerà il target.


2
Hai considerato una vista del tavolo?

In SQL Server potresti semplicemente usare una vista.
JNK,

1
Quale RDBMS? Hai taggato MySQL e Postgres. Le viste funzioneranno nella maggior parte dei RDBMS. Oracle ha sinonimi, che sono gli stessi dei collegamenti simbolici Unix
Phil

MySQL e Postgres, sì. Le menziono anche nel testo. Pensavo che Views non fosse in qualche modo quello che cercavo, ma forse andrà bene. Molte grazie. Pubblica alcune risposte :)
user50849,

1
e perché hai bisogno di due tavoli?
miracle173,

Risposte:


5

Per quanto ne so, un nuovo Postgresql ti consente di INSTEAD OFattivare le viste. Quindi avere una tabella, una vista come SELECT * FROM table1e un INSTEAD OFtrigger per insert, update, deletedovrebbe funzionare per te. Tuttavia, questo approccio non funzionerà in Mysql


2

In MySQL (utilizzando solo il motore di archiviazione MyISAM) è possibile creare una tabella da zero utilizzando i collegamenti simbolici. È possibile in Linux e Windows (usando hardlink):

Ecco i miei post precedenti su questo argomento

Tuttavia, ciò che stai proponendo dovrebbe essere fatto al di fuori di MySQL in Linux.

Per questo esempio

  • / var / lib / mysql è datadir
  • Crea table1 come tabella MyISAM nel database mydb
  • Crea table2 come semplici collegamenti simbolici a table1

PASSAGGIO 01) Crea tabella1

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

PASSAGGIO 02) Creare tre collegamenti simbolici per imitare TableB

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

PASSAGGIO 03) Prova a inserire nella tabella 1 e a leggere dalla tabella 2. Quindi prova il contrario.

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

Se tutto si comporta normalmente, è così che puoi farlo.

AVVERTIMENTO

  1. C'è solo una tabella, table1
  2. Se fai DDL
    • Eseguire il DDL sulla tabella 1
    • È necessario ricreare i collegamenti simbolici table2 dopo DDL rispetto a table1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.