web-dev-qa-db-fra.com

Comment créer un alias de table dans MySQL

Je migre une application MS Access (qui a lié des tables à un serveur MSSQL) vers MySQL.

Afin de surmonter certains problèmes de dénomination des tables 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 des clients également dans mysql.

Pour être clair, je suis pas vouloir alias un nom de table dans une requête comme celle-ci:

SELECT * FROM customers AS dbo_customers

Mais je voudrais plutôt pouvoir émettre la requête suivante:

SELECT * FROM dbo_customers

et lui faire retourner les données de la table des clients.

23
rswolff

Du haut de ma tête

CREATE VIEW dbo_customers AS
SELECT * FROM customers

Ce n'est peut-être pas la meilleure solution, mais cela devrait fonctionner car la vue peut être mise à jour. Fonctionnera certainement en lecture seule

36
DrewM

Vous pouvez créer un Affichage .

CREATE VIEW dbo_customers AS SELECT * FROM customers;

Si cela ne fonctionne pas pour vous, vous pouvez essayer de créer un cliché instantané du tableau et utiliser des déclencheurs pour garder les tableaux synchronisés.

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
Atli

Je renomme toujours mes tables "liées à SQL" dans Access depuis

{dbo_NAME} à {NAME}.

Le lien crée le nom de la table comme {dbo_NAME} mais l'accès a parfois des problèmes avec le préfixe dbo_.

1
murlan

@OMG Poneys poneys a déclaré dans un commentaire:

Pourquoi ne pas renommer la table?

... et cela 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 clients 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 les noms de table SQL Server lorsque les tables MySQL n'étaient pas nommées de la même manière - c'est juste déroutant et cela entraînera des problèmes de maintenance (c'est-à-dire, c'est plus simple pour les tables liées dans l'interface frontale Access pour avoir les mêmes noms que les tables MySQL, dans la mesure du possible). Si j'étais à votre place, 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 devrez probablement le faire une table à la fois, mais à mon avis, le temps qu'il faudra pour le faire maintenant sera plus que compensé par la clarté à l'avenir avec le développement de l'interface d'accès.

1
David-W-Fenton

Les alias seraient sympas, mais MySQL n'a [~ # ~] pas [~ # ~] une telle fonctionnalité.

Une option qui peut répondre à vos besoins, en plus de créer une vue, consiste à utiliser le moteur de stockage FEDERATED 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 y a actuellement quelques limitations avec le moteur de stockage FEDERATED . Voici quelques exemples particulièrement importants:

  • Les tables FEDERATED ne prennent pas en charge les transactions
  • Les tables FEDERATED ne fonctionnent pas avec le cache de requêtes
1
Marcus Adams

Vous pouvez créer un voir nommé dbo_customers qui est soutenu par la table customers.

0
Ben S