【问题标题】:Using MySQL without any procedures or functions在没有任何过程或函数的情况下使用 MySQL
【发布时间】:2012-06-22 20:48:56
【问题描述】:

是否可以在不使用任何程序的情况下在 MySQL 中使用任何类型的逻辑?我的虚拟主机不允许我创建任何程序,因此我正在寻找解决方法。

我想要做的事情只是将一个项目添加到一个表中,如果它不存在的话。或者,如果表中不存在列,则将其添加到表中。有一些操作是可以做到的,比如CREATE TABLE IF NOT EXISTS等等,但是我需要的一些操作没有那么奢侈:(

我后来意识到我可爱的 ​​proc 不起作用,所以我尝试将 IF/ELSE 逻辑编写为顶级查询,但对于 MySQL,IF ELSE 块似乎只能在函数/procs 内工作,而不是在全局范围。

任何解决方法都非常受欢迎 - 我已经要求主机授予我创建程序的权限,但还没有回复...

【问题讨论】:

  • 只是检查,但我假设如果你不能创建程序,你也不能创建函数?
  • 不,没有功能,但我可以访问 INFORMATION_SCHEMA。
  • 请提供您尝试实施的示例。您可以使用键和 SQL 做很多事情。您是否有理由不能在您的应用程序中执行此操作?

标签: mysql stored-procedures if-statement


【解决方案1】:

我想您也无权访问INFORMATION_SCHEMA。您可能会找到解决方案,但在我看来,这样做会更好:

更改您的托管服务提供商。说真的。 为您可以根据需要配置的 MySQL 实例支付更多费用(如果需要)。如果不允许您创建过程和函数,则只有残废的 DBMS。


特定任务的可能解决方法:如果列不存在,您想添加它。

1) 只需ALTER TABLE 并添加该列。如果它已经存在,你会得到一个错误。您可以在应用程序中捕获该错误。

2)(如果您无权访问INFORMATION_SCHEMA)为您的数据库维护一个架构版本。

【讨论】:

  • 我决定使用您的 #2,即维护数据库的正确版本,在应用程序启动时读取版本,如果不同,请运行我的从当前版本号到新版本号的迁移脚本版本。现在更多的工作意味着我未来的工作更少:)
【解决方案2】:

我能想到的最佳解决方案是在 SQL 中使用另一种语言。例如,您可以针对特定记录运行查询,并根据获得的响应,有条件地运行 INSERT 语句。

如果要插入不存在的表,请尝试使用 SHOW TABLES 语句并测试结果集中是否存在名称。

【讨论】:

    【解决方案3】:

    MySQL 支持INSERT IGNORE。和INSERT ... ON DUPLICATE KEY UPDATE

    以下将插入一个新行,但前提是没有id=10 的现有行。 (这假设 id 被定义为唯一键或主键)。

    INSERT IGNORE INTO my_table (id, col1, col2) values (10, "abc", "def");
    

    以下将插入一个新行,但如果存在带有id=10 的现有行(同样,假设 id 是唯一的或主要的),现有行将被更新以保存新值,而不是插入新的行。

    INSERT INTO my_table (id, col1, col2) values (10, "abc", "def")
       ON DUPLICATE KEY UPDATE col1=VALUES(col1), col2=VALUES(col2)
    

    另外,CREATE TABLE 支持 IF NOT EXISTS 修饰符。所以你可以这样做:

    CREATE TABLE IF NOT EXISTS my_table ...
    

    MySQL 中还有许多其他类似的选项和修饰符。查看文档了解更多信息。

    【讨论】:

      【解决方案4】:

      最初我创建了一个大脚本来创建或更新数据库架构,以便更轻松地将数据库更改从我的本地计算机部署到服务器。
      我的脚本做了很多“如果表'abc'存在并且它没有名为'blah'的FK约束”然后在表'abc'上创建一个名为'blah'的FK约束......等等。

      我现在意识到实际上并没有必要检查表是否有特定的列或约束等,因为我可以只维护一个模式版本控制系统,并在我的应用程序启动或导航时查询数据库模式版本到某个页面。

      例如假设我想在表中添加一个新列。它的工作原理是这样的:

      • 向应用代码添加新的迁移脚本,其中包含将列添加到现有表所需的 SQL
      • 将应用的架构版本增加 1
      • 应用启动时,应用向数据库查询数据库的架构版本
      • 如果DB schema-version

      例如如果数据库的架构版本为 5 且应用程序版本为 8,则应用程序会将迁移脚本 5-6、6-7 和 7-8 应用到数据库。这些可以直接运行而无需在数据库端检查任何内容。

      因此,该应用完全负责更新数据库架构,我无需在本地或远程数据库上执行架构更改脚本。

      我认为这是一个比我为我的问题尝试实施的系统更好的系统。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-25
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多