【问题标题】:MySQL: create view if it doesn't exist, but don't alter it if it doesMySQL:如果视图不存在则创建视图,但如果存在则不要更改它
【发布时间】:2015-07-18 05:57:45
【问题描述】:

是否有一种优雅的规范方法可以仅在 MySQL 数据库中创建视图不存在时才创建视图,但如果视图已经存在则不执行任何操作?

有一个similar question here,其答案是使用“CREATE OR REPLACE VIEW”语法。

这对我不起作用,因为如果视图存在,我不想替换它。

理想的语法是像“CREATE IF DOES NOT EXIST VIEW”这样的语法。

【问题讨论】:

  • 我认为做到这一点的唯一方法是使用存储过程对INFORMATION_SCHEMA 执行查询,然后决定是否创建视图。
  • 您是否尝试从应用程序中读取数据库?这可以在脚本/后端方面得到更好的处理。如果只是在数据库中@Barmar 有正确的想法
  • @Bharmar:我正在编写的代码可以在其他人的数据库上执行,我没有事先控制,所以我不能指望那里有存储过程。当然,我也可以创建一个存储过程,但这与视图有相同的问题(如果它已经存在,我不想修改它,只添加从未存在的东西;这样更安全)。
  • 我认为没有任何方法可以直接在 SQL 中执行此操作,您需要使用数据库之外的应用程序语言来执行此操作。
  • @FirebadeDan:是的,我最终想从应用程序中读取视图。就我而言,来自 R 脚本。您建议的代码在应用程序脚本端是什么?现在,我的脚本总是简单地调用“CREATE OR REPLACE VIEW”,这在我的本地数据库上进行测试时是可以的,但是一旦我的代码被其他人使用,这可能会很危险。

标签: mysql view


【解决方案1】:

如果您尝试创建已经存在的视图,则现有视图保持不变。

当然,有一个令人不快的副作用:它会引发错误:) 但也许你可以忍受它......

MySQL 不提供这样的功能。正如 Barmar 建议的那样,使用存储过程(可能是一次性的)或外部脚本,我没有其他选择。

你评论过:

[不考虑替换现有视图] 一旦我的代码被其他人使用,可能会很危险

但您的代码依赖于其他人创建的视图同样危险。您的数据库是应用程序的固有组件,应该这样对待。没有人应该惹它。如果您想让您的用户创建自己的视图,请指示他们在单独的数据库中创建它。

如果您的目标系统只有一个数据库可用(如在大多数共享托管解决方案中),通常的方法是为您自己的结构名称添加前缀。

【讨论】:

  • 你是对的,如果我将语法从“创建或替换视图”更改为简单的“创建视图”,那么我至少可以避免破坏现有视图。但是,如果视图存在,则生成的 stderr 输出很烦人,更糟糕的是错误退出代码(MySQL 在这种情况下返回 1)。如果可能的话,我想避免这种情况。
猜你喜欢
  • 2011-03-20
  • 2021-06-24
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多