0

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

我想做的事情的类型是仅在表不存在的情况下将项目添加到表中。或者,如果表中不存在列,则将其添加到表中。有一些操作可以做之类的CREATE TABLE IF NOT EXISTS,但我需要的一些操作没有这样的奢侈品:(

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

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

4

4 回答 4

1

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

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


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

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

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

于 2012-06-22T21:04:04.603 回答
0

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

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

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

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

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

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

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

于 2012-06-23T09:46:13.277 回答
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 是唯一的或主要的),则现有行将被更新以保存新值,而不是插入新行。

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

于 2012-06-22T21:08:05.007 回答
0

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

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

于 2012-06-22T20:55:30.327 回答