是否可以在不使用任何程序的情况下在MySQL中使用任何类型的逻辑?我的网站托管不允许我创建任何程序,所以我正在寻找一种解决方法。
我想要做的事情只是在表中添加项目(如果它尚不存在)。或者如果列尚未存在,则将其添加到表中。有一些操作可以完成,例如CREATE TABLE IF NOT EXISTS
等,但我需要的一些操作没有这样的奢侈品:(
我后来意识到我的可爱的procs不起作用,所以我尝试将IF / ELSE逻辑编写为顶级查询,但对于MySQL,IF ELSE块似乎只在函数/ proc中工作而不是在全局范围。
任何收到的变通办法 - 我已经要求托管机构授予我创建程序的权限但尚未回复......
答案 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。假设我想在表中添加一个新列。它的工作原理如下:
e.g。如果DB的架构版本为5且应用版本为8,则应用程序将迁移脚本5-6,6-7和7-8应用于数据库。这些只需运行而无需检查数据库端的任何内容。
因此,应用程序全权负责更新数据库架构,并且我无需在本地或远程数据库上执行架构更改脚本。
我认为这是一个比我试图为我的问题实施的系统更好的系统。