【问题标题】:Drop If Exists query in Java App在 Java 应用程序中删除如果存在查询
【发布时间】:2012-09-04 21:08:48
【问题描述】:

我已经尝试寻找类似的问题,但我找到了一个,所以我会发布一个!我正在创建一个为我删除某些表的 Java 程序,MySQL 看起来像这样:

String[] tablesToDrop = new String[]{tableName,tableName2};
Connection con = DriverManager.getConnection(dbUrl, userName,password);
Statement stmt = con.createStatement();

for (int i = 0; i < tablesToDrop.length; i++) {
                System.out.println("Dropping " + tablesToDrop[i] + " Table..");
                stmt.executeUpdate("DROP TABLE IF EXISTS " + tablesToDrop[i]);
            }

我的问题是这对于 SQL Server 2008 版本的外观如何? stmt.executeUpdate(???); 部分?我想删除一个表(如果存在),从数组中获取表名并将其传递到 for 循环中。

【问题讨论】:

  • 不是 sqlserver 专家,而是sqlservercentral.com/forums/Topic478289-338-1.aspx
  • 虽然给出的答案会奏效,但我建议允许您的应用程序删除表是不好的做法并且具有潜在的危险,允许应用程序过多地访问数据库。我建议将临时表或表变量用于临时数据结构。
  • 这很奇怪,这家伙编辑了我的帖子,以至于看起来与 Java 无关,但确实如此。那家伙甚至阅读了我的帖子还是只是随机更改了标签? -.-

标签: java sql-server for-loop


【解决方案1】:
IF EXISTS(select * from sysobjects where name='tblname') drop table tblname

【讨论】:

  • 谢谢,希望这能行得通,因为我还没有在公司建立测试数据库,目前无法在实时系统上尝试这些东西。
  • 所以语句应该是这样的: stmt.executeUpdate("IF EXISTS(select * from sysobjects where name='tablesToDrop[i]') DROP TABLE tablesToDrop[i]); ?
  • 甲骨文呢??
【解决方案2】:

Java 通过驱动程序与 DB 通信。它必须对应用程序程序员绝对透明。因此,MySql 和 MS SQL 服务器之间没有区别。换个驱动就好了。

但在 SQL 方言中可能有所不同。通常人们会尝试通过使用 Java 到 DB 的映射框架(例如 JPA、Hibernate 等)来避免这种差异,但是由于您使用的是普通 JDBC,因此这是您的责任。

我认为您现在尝试的这种说法会奏效。但是对于将来,如果您想使用纯 JDBC 并支持多种数据库类型,我建议您将 SQL 语句保存在单独的文件(例如属性文件)中并从那里读取它们。您甚至可以使用 SQL 方言作为“语言环境”来滥用 ResouceBundle 机制。

【讨论】:

  • +1 答案很棒,因为它解释了很多事情。我想添加另一个帖子的链接,因为方言有所不同:stackoverflow.com/questions/7887011/…
  • 我的驱动程序会动态变化,它会检测我正在连接的数据库类型,但查询是在服务器本身内执行的。该计划适用于一家拥有多年结构的公司,我会这样做,但目前我不是公司里的任何人:)
  • 是的,它确实解释了很多,我也 +1,但我只是在寻找要执行的查询,谢谢先生。
  • 我在评论中的链接中提供了要执行的查询。正如我现在所看到的,@AnandPhadke 在另一个答案中也提供了类似的东西。
猜你喜欢
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 2014-08-10
  • 2010-10-04
相关资源
最近更新 更多