2009-12-11 16 views
18

MS Accessアプリケーション(テーブルをMSSQLサーバーにリンクしている)をMySQLに移行します。MySQLでテーブルエイリアスを作成する方法

いくつかのMSAccessテーブルの名前付けの問題を解決する方法として、MySQLデータベースの既存のテーブルを指すMySQLテーブルエイリアスを追加するソリューションを探しています。理想的にはmysqlのcustomersテーブルを指し示すmysqlの別名 'dbo_customers'を作成したいと思います。

私はは、このようなクエリ内のテーブル名をエイリアスにしたいわけではない明確にする:

SELECT * FROM customers AS dbo_customers 

むしろ、私は次のクエリことが問題になりたい:

SELECT * FROM dbo_customers 

とし、customersテーブルからデータを返します。

+6

に動作しないのですか? –

+3

テーブルの名前を変更することができない場合があります。たとえば、異なる命名規則を持つ2つのORMシステムで作業している場合は、両方をうまく動作させるための別名が必要です。その場合には、受け入れられた解決策は私には十分に良いものでした:) – Nimo

答えて

31
私の頭の上オフ

CREATE VIEW dbo_customers AS 
SELECT * FROM customers 
たぶん

ない最善の解決策が、ビューが更新可能であるように動作するはずです。読み取り専用で確実に動作します

+0

私は私の最初の投稿で、私もデータを更新することができなければならないと言っていたはずです。ビューが何らかの形で更新可能でない限り、ビューが私のニーズを満たすとは思わない? – rswolff

+4

はい、このビューは更新可能です。 – longneck

+0

私は本当にこれが最も簡単な解決策だとは思わない。 –

5

Viewを作成できます。それはあなたのために動作しない場合は

CREATE VIEW dbo_customers AS SELECT * FROM customers; 

、あなたはテーブルのシャドウコピーを作成してみてください、と同期のテーブルを保持するトリガーを使用することができます。例えば

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 
正確

ない 'エイリアス'、そして完璧から遠いです。しかし、他のすべてが失敗した場合、それはオプションです。

0

dbo_customersという名前のviewを作成し、これにはcustomersという表が付いています。

-1

MERGEテーブルエンジン経由でのMySQLのための簡単なソリューションがあります:

たちは、テーブルが現在のテーブルrus_vacanciesは、任意の読み取り書き込み用のテーブルeng_vacanciesに等しい

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

rus_vacanciesを命名し、その英語の同等のものを必要とする持っている想像操作

1つの制限 - 元のテーブルはENGINE = MyISAMでなければなりません(これは簡単に "alter table rus_vacancies ENGINE=MyISAM"で実行できます)

0

@OMGポニーポニーはコメントで述べている:

なぜテーブルの名前を変更していませんか?

...と私には明らかな答えです。

MySQLテーブルの顧客用にODBCリンクテーブルを作成すると、それはcustomersと呼ばれ、テーブルの名前をdbo_customersに変更するだけです。この目的のためにMySQLでビューを作成することは私には分かりません。

これは、MySQLテーブルの名前が同じでないときにSQL Serverテーブル名を使用していたAccessアプリケーションを持っているのがうまくいかず、メンテナンスの問題につながると思います。可能であれば、AccessフロントエンドのリンクテーブルはMySQLテーブルと同じ名前になります)。私があなたの立場にいるなら、検索と置換のユーティリティを得て、すべてのSQL Serverテーブル名をAccessフロントエンド全体のMySQLテーブル名に置き換えます。一度に1つのテーブルを作成する必要がありますが、私の意見では、これを実行するのにかかる時間は、アクセスフロントエンドの開発を進めていく上で明快に補完する以上のものになるでしょう。

+0

通常の使用例では、古いコミットをチェックアウトしています。 – PHPst

1

I常に{NAME}

{dbo_NAME}からのアクセスで私の "SQLにリンクされている" テーブルの名前を変更します。

リンクでテーブル名が{dbo_NAME}になりますが、アクセス時にdbo_接頭辞に問題が発生することがあります。

-2

テーブルのビューを作成し、そこから選択する必要があります。

+0

だから我々はコメント機能を持っているのだ。あなたの答えをもっと説明してください。 –

1

エイリアスはいいですが、MySQLはNOTにこのような機能があります。

ビューを作成するだけでなく、ニーズに応じるオプションの1つは、FEDERATED storage engineをローカルで使用することです。

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://[email protected]:9306/federated/customers'; 

現在、limitations with the FEDERATED storage engineがあります。ここでは、カップル特に重要なものです:

  • FEDERATEDテーブルがトランザクションをサポートしていないテーブルの名前を変更しないのはなぜ
  • FEDERATEDテーブルは、クエリキャッシュで
関連する問題