Puis-je avoir une table comme «alias» ou «lien symbolique» vers une autre?

10

J'ai deux tables avec la même structure, A et B. Une certaine application est écrite de sorte qu'elle écrit toujours les mêmes données dans les deux tables.

Après une discussion avec un collègue sur la possibilité d'économiser de l'espace disque, je me demande si mysql ou postgresql a la capacité de créer sur table comme un "alias", ou "lien symbolique", d'un autre.

Je veux que le comportement soit très similaire à celui d'un lien symbolique de fichier logiciel; où la lecture à partir du lien symbolique lui-même ou de sa cible produira la même sortie, et l'écriture à l'un ou l'autre mettra à jour la cible.

user50849
la source
2
Avez-vous envisagé une vue de la table?
Dans SQL Server, vous pouvez simplement utiliser une vue.
JNK
1
Quel SGBDR? Vous avez étiqueté MySQL et Postgres. Les vues fonctionneront dans la plupart des SGBDR. Oracle a des synonymes, qui sont les mêmes que les liens symboliques Unix
Philᵀᴹ
MySQL et Postgres, oui. Je les mentionne également spécifiquement dans le texte. Je pensais que Views n'était en quelque sorte pas tout à fait ce que je cherchais, mais ce sera peut-être très bien. Merci beaucoup. Postez quelques réponses :)
user50849
1
et pourquoi avez-vous besoin de deux tables?
miracle173

Réponses:

5

Pour autant que je sache, un nouveau Postgresql vous permet d'avoir des INSTEAD OFdéclencheurs sur les vues. Donc, avoir une table, une vue en tant SELECT * FROM table1que INSTEAD OFdéclencheur pour insert, update, deletedevrait fonctionner pour vous. Cette approche ne fonctionnera pas dans Mysql

a1ex07
la source
2

Il est possible dans MySQL (en utilisant uniquement le moteur de stockage MyISAM) de créer une table à partir de zéro à l'aide de liens symboliques. Il est possible sous Linux et Windows (en utilisant des liens physiques):

Voici mes précédents articles sur ce sujet

Cependant, ce que vous proposez devra être fait en dehors de MySQL sous Linux.

Pour cet exemple

  • / var / lib / mysql est datadir
  • Créer table1 comme table MyISAM dans la base de données mydb
  • Créer table2 en tant que liens symboliques purs vers table1

ÉTAPE 01) Créez la table1

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

ÉTAPE 02) Créez trois liens symboliques pour imiter TableB

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

ÉTAPE 03) Essayez d'insérer dans le tableau1 et de lire dans le tableau2. Essayez ensuite l'inverse.

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

Si tout se passe normalement, c'est comme ça que vous pouvez faire.

CAVEAT

  1. Il n'y a qu'une seule table, table1
  2. Si vous faites un DDL
    • Effectuer le DDL sur table1
    • Vous devez recréer les liens symboliques table2 après DDL contre table1
RolandoMySQLDBA
la source