如何在MySQL中创建表别名
我正在将MS Access应用程序(将表链接到MSSQL服务器)迁移到MySQL。如何在MySQL中创建表别名
作为克服一些MSAccess表命名问题的一种方法,我正在寻求一种解决方案来添加一个MySQL表别名,该别名将指向MySQL数据库中的现有表。理想情况下,我想在mysql中创建别名'dbo_customers',它也指向mysql中的customers表。
要清楚我不想别名这样的查询中一个表名:
SELECT * FROM customers AS dbo_customers
反倒是我想能够发出以下查询:
SELECT * FROM dbo_customers
,并让它从customers表中返回数据。
您可以创建一个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
不完全是一个 '别名',并从完善为止。但如果一切都失败了,这是一个选择。
有是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
”轻松完成)
@OMG小马小马在评论说:
为什么不能重命名表?
...这似乎是对我的明显答案。
如果您为MySQL表客户创建ODBC链接表,它将被称为客户,然后您只需将该表重命名为dbo_customers。为了这个目的,我绝对没有必要在MySQL中创建一个视图。
这就是说,我不希望有一个Access应用程序使用SQL Server表名时,MySQL表没有命名为相同的东西 - 这只是令人困惑,并会导致维护问题(即,它更简单尽可能在Access前端的链接表中具有与MySQL表相同的名称)。如果我处于你的位置,我会得到一个搜索和替换实用程序,并将整个Access前端中的所有SQL Server表名替换为MySQL表名。你可能不得不一次把它做成一张表,但在我看来,现在做这件事的时间将不仅仅是为了明确Access前端的发展所做的努力。
常规用例是您签出一个较旧的提交,并需要您使用较旧的代码库进行数据库工作。 – PHPst 2017-12-13 23:01:03
我总是从
{dbo_NAME}
到{NAME}
重命名访问我的 “连接到SQL” 表。
链接将表名称创建为{dbo_NAME}
,但访问偶尔会遇到与dbo_前缀有关的问题。
您必须为表格创建一个视图,然后从中选择。
这就是为什么我们有评论功能。请更好地解释你的答案。 – 2013-09-17 12:48:32
别名会很好,但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。这里有几个特别重要的:
- 联合表格不支持事务
- 联合表格不与查询缓存
为什么不能重命名工作表中? – 2009-12-11 19:05:15
在某些情况下,重命名表格不起作用。例如,如果您使用两个具有不同命名约定的ORM系统,则需要两个别名才能正常工作。在那种情况下,顺便说一下,接受的解决方案对我来说已经足够了:) – Nimo 2014-03-19 22:30:05