2009-12-11 87 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。这里有几个特别重要的:

  • 联合表格不支持事务
  • 联合表格不与查询缓存