如何在整个 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 在 VARCHAR 上引用索引前缀时如何使用 ORDER BY?