如何在MySQL中创建表别名

时间:2009-12-11 18:56:19

标签: sql mysql sql-server ms-access

我正在将MS Access应用程序(将表链接到MSSQL Server)迁移到MySQL。

作为克服某些MSAccess表命名问题的一种方法,我正在寻找一种解决方案来添加MySQL表别名,该别名将指向MySQL数据库中的现有表。理想情况下,我想在mysql中创建别名'dbo_customers',它也指向mysql中的customers表。

要明确我想要在查询中对表名进行别名,如下所示:

SELECT * FROM customers AS dbo_customers

但我希望能够发出以下查询:

SELECT * FROM dbo_customers

并让它从customers表返回数据。

8 个答案:

答案 0 :(得分:35)

脱离我的头顶

CREATE VIEW dbo_customers AS
SELECT * FROM customers

也许不是最好的解决方案,但应该可以正常工作,因为视图是可更新的。肯定适用于只读

答案 1 :(得分:6)

您可以创建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

不完全是'别名',远非完美。但如果所有其他方法都失败了,这是一个选择。

答案 2 :(得分:1)

@OMG小马小马在评论中说:

  

为什么不重命名表?

......这似乎是我明显的答案。

如果为MySQL表客户创建ODBC链接表,它将被称为客户,然后您只需将表重命名为dbo_customers。为此,我无需在MySQL中创建视图。

那就是说,当MySQL表没有被命名为同一个东西时,我讨厌有一个使用SQL Server表名的Access应用程序 - 这只是令人困惑并且会导致维护问题(即,它更简单Access前端中的链接表与MySQL表具有相同的名称(如果可能)。如果我在你的位置,我会得到一个搜索和替换实用程序,并在整个Access前端用MySQL表名替换所有SQL Server表名。你可能不得不一次只做一张桌子,但在我看来,现在这样做所需要的时间远远超过了前端开发的前端。

答案 3 :(得分:1)

我总是在

中重命名Access中的“链接到SQL”表

{dbo_NAME}{NAME}

该链接将表名创建为{dbo_NAME},但访问偶尔会出现dbo_前缀问题。

答案 4 :(得分:1)

别名会很好,但MySQL NOT 有这样的功能。

除了创建视图之外,可以满足您需求的一个选项是在本地使用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://fed_user@localhost:9306/federated/customers';

目前有一些limitations with the FEDERATED storage engine。以下是一些特别重要的事情:

  • FEDERATED表不支持交易
  • FEDERATED表不适用于查询缓存

答案 5 :(得分:0)

您可以创建一个由dbo_customers表支持的名为customers的{​​{3}}。

答案 6 :(得分:-1)

通过MERGE表引擎有一个更简单的MySQL解决方案:

假设我们有一个名为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”轻松完成)

答案 7 :(得分:-2)

您必须为表创建一个视图,然后从中进行选择。