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.

21
demandé sur rswolff 2009-12-11 21:56:19

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

33
répondu DrewM 2009-12-11 18:58:20

Vous pouvez créer une vue .

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.

6
répondu Atli 2009-12-11 19:26:18

@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.

1
répondu David-W-Fenton 2010-01-15 19:21:56

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_.

1
répondu murlan 2012-11-13 20:33:29

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
1
répondu Marcus Adams 2014-07-02 13:27:31

Vous pouvez créer une vue nommée {[0] } qui est soutenue par la table customers.

0
répondu Ben S 2009-12-11 18:59:37

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")

-1
répondu mitlas 2013-01-01 15:17:35

Vous devez créer une vue pour la table, puis sélectionner à partir de cela.

-2
répondu Shrikant Dhotre 2013-09-17 12:55:11