2009-12-11 137 views
18

我正在將MS Access應用程序(將錶鏈接到MSSQL服務器)遷移到MySQL。如何在MySQL中創建表別名

作爲克服一些MSAccess表命名問題的一種方法,我正在尋求一種解決方案來添加一個MySQL表別名,該別名將指向MySQL數據庫中的現有表。理想情況下,我想在mysql中創建別名'dbo_customers',它也指向mysql中的customers表。

要清楚我想別名這樣的查詢中一個表名:

SELECT * FROM customers AS dbo_customers 

反倒是我想能夠發出以下查詢:

SELECT * FROM dbo_customers 

,並讓它從customers表中返回數據。

+6

爲什麼不能重命名工作表中? – 2009-12-11 19:05:15

+3

在某些情況下,重命名錶格不起作用。例如,如果您使用兩個具有不同命名約定的ORM系統,則需要兩個別名才能正常工作。在那種情況下,順便說一下,接受的解決方案對我來說已經足夠了:) – Nimo 2014-03-19 22:30:05

回答

31

把我的頭

CREATE VIEW dbo_customers AS 
SELECT * FROM customers 

也許不是最好的解決辦法的頂部,但應該工作作爲視圖是可更新的。肯定會爲只讀工作

+0

我應該在我的初始文章中說過我必須能夠更新數據。我不認爲某種觀點能夠滿足我的需求 - 除非意見能以某種方式更新? – rswolff 2009-12-11 19:05:39

+4

是的,這個視圖是可更新的。 – longneck 2009-12-11 19:22:56

+0

我真的不認爲這是最簡單的解決方案。 – 2010-01-16 23:00:30

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_customersview,該表由customers表提供支持。

-1

有是MySQL通過MERGE表引擎一個簡單的解決方案:

想象我們已經表命名rus_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等於表eng_vacancies任何讀寫操作

一個限制 - 原始表必須具有ENGINE = MyISAM(可以通過「alter table rus_vacancies ENGINE=MyISAM」輕鬆完成)

0

@OMG小馬小馬在評論說:

爲什麼不能重命名錶?

...這似乎是對我的明顯答案。

如果您爲MySQL表客戶創建ODBC鏈接表,它將被稱爲客戶,然後您只需將該表重命名爲dbo_customers。爲了這個目的,我絕對沒有必要在MySQL中創建一個視圖。

這就是說,我不希望有一個Access應用程序使用SQL Server表名時,MySQL表沒有命名爲相同的東西 - 這只是令人困惑,並會導致維護問題(即,它更簡單儘可能在Access前端的鏈接表中具有與MySQL表相同的名稱)。如果我處於你的位置,我會得到一個搜索和替換實用程序,並將整個Access前端中的所有SQL Server表名替換爲MySQL表名。你可能不得不一次把它做成一張表,但在我看來,現在做這件事的時間將不僅僅是爲了明確Access前端的發展所做的努力。

+0

常規用例是您簽出一個較舊的提交,並需要您使用較舊的代碼庫進行數據庫工作。 – PHPst 2017-12-13 23:01:03

1

我總是從

{dbo_NAME}{NAME}重命名訪問我的 「連接到SQL」 表。

鏈接將表名稱創建爲{dbo_NAME},但訪問偶爾會遇到與dbo_前綴有關的問題。

-2

您必須爲表格創建一個視圖,然後從中選擇。

+0

這就是爲什麼我們有評論功能。請更好地解釋你的答案。 – 2013-09-17 12:48:32

1

別名會很好,但MySQL確實有不是有這樣的功能。

除了創建視圖之外,可以滿足您需求的一個選項是在本地使用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。這裏有幾個特別重要的:

  • 聯合表格不支持事務
  • 聯合表格不與查詢緩存