Comment créer un alias de table dans MySQL
Je migre une application MS Access (qui a des tables liées à un serveur MSSQL) vers MySQL.
Comme moyen de surmonter certains problèmes de nommage de table MSAccess, je cherche une solution pour ajouter un alias de table MySQL qui pointera vers une table existante dans la base de données MySQL. Idéalement, je voudrais créer l'alias 'dbo_customers' dans mysql qui pointerait vers la table customers également dans mysql.
Pour être clair, je suis Pas voulant alias un nom de table dans une requête comme ceci:
SELECT * FROM customers AS dbo_customers
Mais plutôt je voudrais pouvoir émettre la requête suivante:
SELECT * FROM dbo_customers
Et demandez-lui de renvoyer les données de la table customers.
8 réponses
Du haut de ma tête
CREATE VIEW dbo_customers AS
SELECT * FROM customers
Peut-être pas la meilleure solution mais devrait fonctionner car la vue est modifiable. Va certainement fonctionner en lecture seule
CREATE VIEW dbo_customers AS SELECT * FROM customers;
Si cela ne fonctionne pas pour vous, vous pouvez essayer de créer une copie fantôme de la table et utiliser des déclencheurs pour synchroniser les tables.
Par exemple:
CREATE TABLE t1( id serial primary key, field varchar(255) not null );
CREATE TABLE dbo_t1( id serial primary key, field varchar(255) not null );
-- INSERT trigger
CREATE TRIGGER t1_dbo_insert AFTER INSERT ON t1
FOR EACH ROW BEGIN
INSERT INTO dbo_t1 SET field = NEW.field;
-- No need to specify the ID, it should stay in-sync
END
-- UPDATE trigger
CREATE TRIGGER t1_dbo_update AFTER UPDATE ON t1
FOR EACH ROW BEGIN
UPDATE dbo_t1 SET field = NEW.field WHERE id = NEW.id;
END
-- DELETE trigger
CREATE TRIGGER t1_dbo_delete AFTER DELETE ON t1
FOR EACH ROW BEGIN
DELETE FROM dbo_t1 WHERE id = OLD.id;
END
Pas exactement un "alias", et loin d'être parfait. Mais c'est une option, si tout le reste échoue.
@OMG Poneys poneys dit dans un commentaire:
Pourquoi ne pas renommer la table?
...et il me semble la réponse évidente.
Si vous créez une table liée ODBC pour les clients de la table MySQL, elle sera appelée customers et tout ce que vous avez à faire est de renommer la table en dbo_customers. Il n'y a absolument aucun besoin que je puisse voir pour créer une vue dans MySQL à cet effet.
Cela dit, je détesterais avoir une application Access qui utilisait des noms de table SQL Server lorsque les tables MySQL n'ont pas été nommées de la même manière-c'est juste déroutant et entraînera des problèmes de maintenance (c'est-à-dire qu'il est plus simple pour les tables liées dans le frontal Access d'avoir les mêmes noms que les tables MySQL, autant que possible). Si j'étais dans votre position, j'obtiendrais un utilitaire de recherche et de remplacement et remplacerais tous les noms de table SQL Server par les noms de table MySQL tout au long du frontal Access. Vous auriez probablement faire une table à la fois, mais à mon avis, le temps qu'il prend pour le faire maintenant va être plus que dans la clarté d'aller de l'avant avec le développement de l'Accès frontal.
Je renomme toujours mes tables "liées à SQL" dans Access from
{dbo_NAME}
de {NAME}
.
Le lien crée le nom de la table comme {[0] } mais access a parfois des problèmes avec le préfixe dbo_.
Les Alias seraient bien, mais MySQL ne pas ont une telle fonctionnalité.
Une option qui peut répondre à vos besoins, en plus de créer une vue, est d'utiliser le moteur de stockage fédéré localement.
CREATE TABLE dbo_customers (
id INT(20) NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL DEFAULT '',
PRIMARY KEY (id),
)
ENGINE=FEDERATED
DEFAULT CHARSET=latin1
CONNECTION='mysql://fed_user@localhost:9306/federated/customers';
Il existe actuellement des limitations avec le moteur de stockage fédéré . Voici quelques-uns particulièrement importants:
- les tables fédérées ne prennent pas en charge les transactions
- les tables fédérées ne fonctionnent pas avec le cache de requête
Il existe une solution plus simple pour MySQL via MERGE table engine:
Imaginez que nous ayons une table nommée rus_vacancies
et que nous ayons besoin de son équivalent anglais
create table eng_vacancies select * from rus_vacancies;
delete from eng_vacancies;
alter table eng_vacancies ENGINE=MERGE;
alter table eng_vacancies UNION=(rus_vacancies);
Maintenant, La table rus_vacancies
est égale à la table eng_vacancies
pour toutes les opérations de lecture-écriture
Une limitation-la table d'origine doit avoir ENGINE = MyISAM(cela peut être facilement fait par "alter table rus_vacancies ENGINE=MyISAM
")
Vous devez créer une vue pour la table, puis sélectionner à partir de cela.