如何在 MySQL 中创建表别名
Posted
技术标签:
【中文标题】如何在 MySQL 中创建表别名【英文标题】:How do I create a table alias in MySQL 【发布时间】:2010-12-25 19:09:58 【问题描述】:我正在将 MS Access 应用程序(已将表链接到 MSSQL Server)迁移到 mysql。
作为克服某些 MSAccess 表命名问题的一种方法,我正在寻找一种解决方案来添加一个 MySQL 表别名,该别名将指向 MySQL 数据库中的现有表。理想情况下,我想在 mysql 中创建别名“dbo_customers”,该别名也将指向 mysql 中的客户表。
需要明确的是,我不想在这样的查询中为表名起别名:
SELECT * FROM customers AS dbo_customers
但我希望能够发出以下查询:
SELECT * FROM dbo_customers
并让它从客户表中返回数据。
【问题讨论】:
为什么不重命名表格? 在某些情况下重命名表不起作用。例如,如果您正在使用具有不同命名约定的两个 ORM 系统,则需要一个别名才能正常工作。在那种情况下,顺便说一句,接受的解决方案对我来说已经足够好了:) 【参考方案1】:想不通
CREATE VIEW dbo_customers AS
SELECT * FROM customers
也许不是最好的解决方案,但应该可以工作,因为视图是可更新的。绝对适用于只读
【讨论】:
我应该在我最初的帖子中说我还必须能够更新数据。我认为视图不能满足我的需求——除非视图可以以某种方式更新? 我真的不认为这是最简单的解决方案。 绝对是最简单的大卫。它的行为几乎与原始表相同。你可以给它写信,把它加入到各种查询中,等等。性能方面,我不太确定,但是从您的软件和查询的角度来看,出于 MOST 目的,该视图与真实表无法区分。 为什么这是一个糟糕的解决方案?它似乎完美地回答了这个问题。效率低吗?我正在使用一个遗留系统,在该系统中,原始开发人员作为“安全性默默无闻”,将用户信息表命名为一长串随机字符。我希望能够以“用户”的身份访问它。 (由于各种原因,不,我不能只重命名现有表。) 如果在存储过程中使用这个,那么多人不能同时访问存储过程。【参考方案2】:您可以创建一个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
不完全是“别名”,而且远非完美。但如果一切都失败了,这是一个选择。
【讨论】:
【参考方案3】:通过 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
”轻松完成)
【讨论】:
【参考方案4】:您可以创建一个名为dbo_customers
的view,它由customers
表支持。
【讨论】:
【参考方案5】:@OMG Ponies 小马在评论中说:
为什么不重命名表格?
...这对我来说似乎是显而易见的答案。
如果您为 MySQL 表客户创建 ODBC 链接表,它将被称为客户,然后您所要做的就是将表重命名为 dbo_customers。完全没有必要为此在 MySQL 中创建视图。
也就是说,当 MySQL 表的名称不同时,我不希望有一个使用 SQL Server 表名的 Access 应用程序——这只会令人困惑并且会导致维护问题(即,它更简单Access 前端中的链接表尽可能与 MySQL 表具有相同的名称)。如果我在你的位置,我会得到一个搜索和替换实用程序,并在整个 Access 前端用 MySQL 表名替换所有 SQL Server 表名。您可能必须一次只做一张桌子,但在我看来,现在做这件事所花费的时间将远远超过 Access 前端开发的清晰度。
【讨论】:
一个常规的用例是你签出一个较旧的提交并且需要你的数据库使用旧的代码库。【参考方案6】:我总是从
重命名 Access 中的“链接到 SQL”表dbo_NAME
到 NAME
。
该链接将表名创建为dbo_NAME
,但访问有时会出现 dbo_ 前缀的问题。
【讨论】:
【参考方案7】:别名会很好,但 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://fed_user@localhost:9306/federated/customers';
目前有一些limitations with the FEDERATED storage engine。这里有几个特别重要的:
FEDERATED 表不支持事务 FEDERATED 表不适用于查询缓存【讨论】:
以上是关于如何在 MySQL 中创建表别名的主要内容,如果未能解决你的问题,请参考以下文章