使用MySQL而无需任何程序或功能

时间:2012-06-22 20:48:56

标签: mysql stored-procedures if-statement

是否可以在不使用任何程序的情况下在MySQL中使用任何类型的逻辑?我的网站托管不允许我创建任何程序,所以我正在寻找一种解决方法。

我想要做的事情只是在表中添加项目(如果它尚不存在)。或者如果列尚未存在,则将其添加到表中。有一些操作可以完成,例如CREATE TABLE IF NOT EXISTS等,但我需要的一些操作没有这样的奢侈品:(

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

任何收到的变通办法 - 我已经要求托管机构授予我创建程序的权限但尚未回复......

4 个答案:

答案 0 :(得分:1)

我想你也无法访问INFORMATION_SCHEMA。您可以找到解决方案,但在我的意见中,它会更好:

更改您的托管服务提供商。认真地。支付更多 - 如果需要 - 为您可以根据需要配置的MySQL实例。如果不允许您创建过程和函数,则只有一个残缺的DBMS。


特定任务的可行解决方法:如果列不存在,则需要添加列。

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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为unique或primary),则会更新现有行以保存新值,而不是插入新的一行。

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中还有许多其他类似的选项和修饰符。查看文档了解更多信息。

答案 3 :(得分:0)

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

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

e.g。假设我想在表中添加一个新列。它的工作原理如下:

  • 向应用程序代码添加新的迁移脚本,其中包含将列添加到现有表所需的SQL
  • 将应用的架构版本增加1
  • 在应用启动时,应用会向数据库查询数据库的架构版本
  • 如果是DB schema-version< app schema-version,在两个模式版本之间执行SQL迁移脚本,然后将DB模式版本更新为与应用程序相同

e.g。如果DB的架构版本为5且应用版本为8,则应用程序将迁移脚本5-6,6-7和7-8应用于数据库。这些只需运行而无需检查数据库端的任何内容。

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

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