2009-12-11 24 views
18

Dokonuję migracji aplikacji MS Access (która powiązała tabele z serwerem MSSQL) do MySQL.Jak utworzyć alias tabeli w MySQL

Jako sposób na przezwyciężenie niektórych problemów z nazwami tabel MSAccess, szukam rozwiązania, aby dodać alias tabeli MySQL, który wskaże istniejącą tabelę w bazie danych MySQL. Idealnie chciałbym utworzyć alias "dbo_customers" w mysql, który wskazywałby tabelę klientów również w mysql.

Żeby było jasne jestem nie chcąc aliasu nazwy tabeli wewnątrz kwerendy tak:

SELECT * FROM customers AS dbo_customers 

Ale raczej chciałbym móc wydaj następujące zapytanie:

SELECT * FROM dbo_customers 

i zwróć dane z tabeli klientów.

+6

Dlaczego nie zmieniać nazwy tabeli? –

+3

W niektórych przypadkach zmiana nazwy tabeli nie będzie działać. Na przykład, jeśli pracujesz z dwoma systemami ORM z różnymi konwencjami nazewnictwa, musisz mieć alias, aby oba mogły dobrze działać. W tym przypadku, przy okazji, przyjęte rozwiązanie było dla mnie wystarczająco dobre :) – Nimo

Odpowiedz

31

Off górze głowie

CREATE VIEW dbo_customers AS 
SELECT * FROM customers 

Może nie najlepsze rozwiązanie, ale powinno działać jak widok jest aktualizowalny. Z pewnością zadziała tylko w trybie Read Only

+0

Powinienem był powiedzieć w moim pierwszym poście, że muszę być w stanie aktualizować dane również. Nie sądzę, że widok spełni moje potrzeby - chyba że poglądy są w jakiś sposób możliwe do uaktualnienia? – rswolff

+4

Tak, ten widok jest aktualizowalny. – longneck

+0

Naprawdę nie sądzę, że jest to najprostsze rozwiązanie. –

5

Możesz utworzyć View.

CREATE VIEW dbo_customers AS SELECT * FROM customers; 

Jeśli to nie zadziała, możesz spróbować tworząc cień-kopię tabeli i użyć wyzwalaczy zachować tabel zsynchronizowane.

Na przykład:

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 

Niezupełnie za 'alias' i dalekie od doskonałości. Ale jest to opcja, jeśli wszystko inne zawiedzie.

0

można utworzyć view nazwie dbo_customers który jest wspierany przez stół customers.

-1

istnieje prostsze rozwiązanie dla MySQL poprzez silnik tabeli Merge:

wyobrazić mamy tabela o nazwie rus_vacancies i potrzeba jego odpowiednik angielski

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

teraz stół rus_vacancies równa tabeli eng_vacancies dla każdego odczytu operacje

jedno ograniczenie - oryginalna tabela musi mieć SILNIK = MyISAM (można to łatwo zrobić przez "alter table rus_vacancies ENGINE=MyISAM")

0

@OMG Kucyki Kuce powiedział w komentarzu:

Dlaczego nie zmienić nazwę tabeli?

... i wydaje się oczywistą odpowiedzią dla mnie.

Jeśli utworzysz połączoną tabelę ODBC dla klientów tabeli MySQL, będzie ona nazywana klientami, a następnie wystarczy zmienić nazwę tabeli na dbo_customers.Nie ma absolutnie żadnej potrzeby, aby zobaczyć, aby utworzyć widok w MySQL w tym celu.

Powiedziałbym, że nie chciałbym mieć aplikacji Access, która używała nazw tabel SQL Server, gdy tabele MySQL nie nazywałyby się tym samym - to jest po prostu mylące i prowadzi do problemów konserwacyjnych (tj. połączone tabele w interfejsie dostępu programu Access mają te same nazwy, co tablice MySQL, jeśli tylko jest to możliwe). Gdybym był na twojej pozycji, dostałbym narzędzie do wyszukiwania i zamiany i zastąpił wszystkie nazwy tabel SQL Server nazwami tabel MySQL na całym interfejsie dostępu. Najprawdopodobniej będziesz musiał zrobić to po jednym stole na raz, ale moim zdaniem czas potrzebny na zrobienie tego teraz będzie bardziej niż zrekompensowany w jasności idącej za rozwojem interfejsu Access.

+0

regularne użycie to wypisanie do starszego zatwierdzenia i potrzeba, aby baza danych działała ze starszą bazą kodów. – PHPst

1

Zawsze zmień moje "związanych z SQL" tabel w programie Access z

{dbo_NAME} do {NAME}.

Łącze tworzy nazwę tabeli jako {dbo_NAME}, ale dostęp czasami powoduje problemy z prefiksem dbo_.

-2

Musisz utworzyć widok tabeli, a następnie wybrać z niej.

+0

dlatego mamy funkcję komentarzy. Proszę, wyjaśnij swoją odpowiedź. –

1

Aliasy będą miłe, ale MySQL ma NOT mają taką funkcję.

Jedną opcją, która może służyć Twoim potrzebom, oprócz tworzenia widoku, jest używanie lokalnie 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'; 

Obecnie niektóre limitations with the FEDERATED storage engine. Oto kilka z nich szczególnie ważne:

  • stoły FEDERATED nie obsługuje transakcji stoły
  • FEDERATED nie działają z cache zapytań