如何在整个 MySQL 脚本上假设一个表前缀?

Posted

技术标签:

【中文标题】如何在整个 MySQL 脚本上假设一个表前缀?【英文标题】:How to assume a table prefix on a entire MySQL script? 【发布时间】:2013-02-27 01:08:10 【问题描述】:

我有一个脚本要在我的数据库中运行。 但问题是这个脚本假设表没有前缀并且所有数据库都有前缀(我们称之为prefix_)。

有没有命令或者方法让 mysql 尝试运行

INSERT INTO prefix_mytable ...

而不是

INSERT INTO mytable...

对于脚本中的所有 sql 查询(UPDATE、INSERT 和 DELETE)?

【问题讨论】:

不,您的脚本必须考虑到这一点。 MySQL 只知道它拥有的表名(前缀) Michael,如果我们可以在 mysql 中使用一些内部选项,例如 ASSUME_GLOBAL_PREFIX 并将其设置为 prefix_,这应该可以工作。但是有这样的选择吗? =/ 我的意思是我在文档中遇到过的 MySQL 中没有这样的选项。我希望有人在下面的答案中证明我错了,因为我同意这会很有用。如果你告诉我们你是如何运行脚本的,也许有人会有一个向导破解建议。 我需要运行一个用于 magento 翻译的脚本(额外的包)。但是问题,正如我所说,脚本没有找到表,因为我托管安装的服务器在表上放置了前缀...... 我认为你需要修改脚本。 【参考方案1】:

MySQL 无法按照您所描述的方式自动为表添加前缀。 @MichaelBerkowski 是正确的。

我能建议的最好的方法是创建第二个具有可更新视图的数据库,使用不带前缀的名称作为前缀表名的前端。

这是一个例子:

mysql> CREATE DATABASE test;
mysql> CREATE TABLE test.prefix_mytable (id INT PRIMARY KEY, x VARCHAR(20));
mysql> CREATE DATABASE test2;
mysql> CREATE VIEW test2.mytable AS SELECT * FROM test.prefix_mytable;

现在您可以使用不带前缀的名称插入:

mysql> INSERT INTO test2.mytable (id, x) VALUES (123, 'abc');

并验证数据是否已插入到您的原始表中:

mysql> SELECT * FROM test.prefix_mytable;

完成此操作后,您可以针对数据库 test2 运行 SQL 脚本,所有 INSERT 都应该可以正常访问您的原始表。

如果您有很多表需要为其创建视图,您可以自动创建 CREATE VIEW 语句:

mysql> SELECT CONCAT('CREATE VIEW test2.', REPLACE(TABLE_NAME, 'prefix_', ''), 
  ' AS SELECT * FROM test.', TABLE_NAME, ';') AS _sql 
  FROM INFORMATION_SCHEMA.TABLES 
  WHERE TABLE_SCHEMA='test' AND TABLE_NAME LIKE 'prefix\_%';

【讨论】:

有效。疯狂,但有效。 @MichaelBerkowski,哈哈!谢谢!每个问题都是可以解决的——这只是一个人必须跳过多少圈的问题。 :-) 有趣的解决方案。但它看起来像是一个糟糕的 MySQL 限制,如果我们有一个名为 prefix 的内部变量,这可能非常容易^^ @GarouDan,你能说出任何其他支持这个想法的 RDBMS 产品吗?【参考方案2】:

这是将 WordPress 表前缀从 wp_ 替换为不同的指南,像这样您可以更新任何 mysql 表。 How to rename WordPress tables prefix?

【讨论】:

请尝试阅读此***.com/help/deleted-answers,以进一步了解如何回答。即:“没有从根本上回答问题的答案”:仅是指向外部网站的链接

以上是关于如何在整个 MySQL 脚本上假设一个表前缀?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除所有以某个前缀开头的 MySQL 表?

MySQL 在 VARCHAR 上引用索引前缀时如何使用 ORDER BY?

MySQL前缀索引

mysql批量删除指定前缀或后缀表

Mysql:如何从其他 sql 脚本文件中调用 sql 脚本文件?

如何在 Laravel 5 中为表使用全局前缀