gpt4 book ai didi

mysql - 动态 SQL 替代方案 (MySql)

转载 作者:太空宇宙 更新时间:2023-11-03 11:41:04 25 4
gpt4 key购买 nike

在当前的 MySql 数据库服务器上,我有两个模式:“ friend ”、“地点”。整个数据库是围绕从外部调用的存储过程组织的。也许这是个好方法,也许不好,但这与我遇到的这个问题无关。在这种情况下,数据库必须与使用它的任何外部软件分开(因为我只负责数据库)。

“Friends”模式中的一些存储过程引用“Places”中的表,反之亦然。现在,例如,如果我想在同一台服务器上设置一组新的模式,但对于另一个像这样的“客户端”:

Friends_clientOne
Places_clientOne
Friends_clientTwo
Places_clientTwo

我遇到了一个问题 - 从另一个模式引用表的存储过程不知道要使用哪个模式名称。每次创建新集时都检查和修改每个过程以适合适当的模式名称不是一种选择。动态 SQL 对我来说是全新的——还有哪些其他选择?例如,我该怎么做:

(stored procedure inside schema Friends_clientOne):
Select * from Places_<getCurrentSchemaSuffix>.someTable;

请告诉我 MySql 对此足够灵活:( Percona 怎么样?

最佳答案

与您所描述的最接近的是内置函数 DATABASE() ( http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_database ),它返回当前的默认 数据库。

默认数据库不一定是给定表所属的数据库。这是最近在 USE <databasename> 中命名的数据库陈述。如果您可以依赖您的应用程序始终使用该表所属的数据库,那么您可以使用该功能。

但是,没有任何 SQL 实现允许您在查询执行期间动态更改表名。您只能在 准备语句并将其硬编码到查询中之前命名表。没有使表名可变的语法。

因此即使您使用 DATABASE() 也必须使用动态 SQL功能。

对于这个问题,Percona Server 与普通的 Oracle MySQL 没有什么不同。

你对这个问题的选择是:

  1. 停止为每个客户端使用多个模式。将每个客户端的所有数据放入一个模式中。这似乎是最简单的。

  2. 将存储过程设计为对每个客户都是唯一的。你说你不想这样做。但就其值(value)而言,我们在我当前工作管理的客户数据库中的存储过程和触发器中执行此操作。它没有那么坏。我们有一个"template"版本的 CREATE每个触发器或过程的语句,以及客户 ID 的占位符标记。当我们创建新客户的数据库时,我们复制该模板代码并替换客户 ID 占位符,然后运行它。

  3. 将您每个客户的数据放入他们自己独有的 MySQL 服务器实例中。这样,您可以为每个客户端拥有多个模式,但模式名称不需要对每个客户端都不同。您可以在一台服务器主机上运行多个实例,它们只需要配置不同的数据目录、端口、sock_file 和其他日志文件。虽然我看到有人使用过这个解决方案,但我不推荐它,因为它有很多资源开销,而且很难管理。

  4. 学习使用动态 SQL。

关于mysql - 动态 SQL 替代方案 (MySql),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41655601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com