sql-server 如何在MySQL中创建表别名

6g8kf2rb  于 2022-10-31  发布在  Mysql
关注(0)|答案(8)|浏览(149)

我正在将一个MS Access应用程序(它将表链接到MSSQL Server)迁移到MySQL。
作为解决MSAccess表命名问题的一种方法,我正在寻找一种解决方案,添加一个指向MySQL数据库中现有表的MySQL表别名。理想情况下,我希望在mysql中创建一个别名“dbo_customers”,它也指向mysql中的customers表。
为了清楚起见,我 * 不 * 希望在这样的查询中为表名设置别名:

SELECT * FROM customers AS dbo_customers

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

SELECT * FROM dbo_customers

并让它返回customers表中的数据。

g2ieeal7

g2ieeal71#

我突然想到

CREATE VIEW dbo_customers AS
SELECT * FROM customers

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

bhmjp9jg

bhmjp9jg2#

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

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

mspsb9vt

mspsb9vt3#

通过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“轻松完成)

x9ybnkn6

x9ybnkn64#

您可以创建一个名为dbo_customersview,它由customers表支持。

bvuwiixz

bvuwiixz5#

@OMG Ponies小马在评论中表示:
为什么不重命名该表?
......对我来说,这似乎是显而易见的答案。
如果您为MySQL表customers创建一个ODBC链接表,它将被称为customers,然后您所要做的就是将该表重命名为dbo_customers。我认为完全没有必要为此目的在MySQL中创建一个视图。
也就是说,我不希望有一个Access应用程序使用SQLServer表名,而MySQL表的名称却不一样--这只会让人感到困惑,并会导致维护问题(也就是说,如果可能,Access前端中的链接表与MySQL表具有相同的名称会更简单)。如果我处于您的位置,我会得到一个搜索和替换实用程序,并在整个Access前端将所有SQLServer表名替换为MySQL表名。您可能需要一次一个表地执行此操作,但在我看来,现在完成这一工作所花费的时间将远远超过Access前端开发过程中的清晰度。

czq61nw1

czq61nw16#

我总是将Access中的“链接到SQL”表重命名为
{dbo_NAME}更改为{NAME}
该链接将表名创建为{dbo_NAME},但Access偶尔会出现dbo_前缀问题。

67up9zun

67up9zun7#

别名是不错的,但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。下面是一些特别重要的limitations with the FEDERATED storage engine

  • FEDERATED表不支持事务
  • FEDERATED表不能与查询高速缓存一起使用
8tntrjer

8tntrjer8#

我想提一下我探索过(并放弃了)的一个糟糕的解决方案,那就是在.frm、.MYD和.MYI文件上使用硬链接,这些文件对应于我在/var/lib/mysql/{name_of_my_database}/中的表。
对于InnoDB表,它根本不能(即使您硬链接.idb文件),因为表也在ibdata1中被引用。
对于MyISAM表,它可以正常工作,但它不能,因为在内存中,这些表仍然是不同的,因此不共享缓存。因此,如果您将一行写入original_table,它不会立即出现在aliased_table中。您必须首先刷新表......这会破坏目的,甚至会导致数据丢失(如果在刷新前在原始数据和别名中都插入了一行,则只保留一行)。
我认为我的实验值得一提,作为一个警示故事。

相关问题