我正在将MS Access应用程序(将表链接到MSSQL Server)迁移到MySQL。
作为克服某些MSAccess表命名问题的一种方法,我正在寻找一种解决方案来添加MySQL表别名,该别名将指向MySQL数据库中的现有表。理想情况下,我想在mysql中创建别名'dbo_customers',它也指向mysql中的customers表。
要明确我不想要在查询中对表名进行别名,如下所示:
SELECT * FROM customers AS dbo_customers
但我希望能够发出以下查询:
SELECT * FROM dbo_customers
并让它从customers表返回数据。
答案 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)
为什么不重命名表?
......这似乎是我明显的答案。
如果为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。以下是一些特别重要的事情:
答案 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)
您必须为表创建一个视图,然后从中进行选择。