【问题标题】:PostgreSQL JDBC - can drop but not recreate indexesPostgreSQL JDBC - 可以删除但不能重新创建索引
【发布时间】:2010-07-29 01:37:18
【问题描述】:

我一直在寻找答案,但到目前为止没有运气......

我想对可能有数百万条记录的数据库执行批量操作,阅读 PostgreSQL 指南:'13.4 填充数据库'1,它建议删除索引和外键约束以加快复制操作。

我正在尝试使用 JDBC 语句来完成此操作,我发现我可以毫无问题地删除索引,但是在填充数据库后重新创建它们有问题。我在创建的索引名称处或附近出现语法错误:

Statement stmt = connection.createStatement();
String query = "CREATE UNIQUE INDEX type_uk ON cell (field1, field2, field3, field4) WHERE field3 AND field4 IS NOT NULL TABLESPACE lcindex";

stmt.executeUpdate(query);
connection.commit();

如果我在 psql 中执行这个查询,它会成功创建索引,所以我有点困惑......

任何帮助、见解、建议等将不胜感激:) 提前致谢。

【问题讨论】:

  • 我可以使用 Jython 的 JDBC 创建这样的索引(没有 TABLESPACE)。给我们更多信息:是否可以创建简单的索引?你用的是什么版本的 JDBC 和 PostgreSQL?
  • 我一直在尝试删除并重新创建这些唯一索引,我会尝试删除一个简单的索引并回复您...我正在使用 JDBC 8.4-701 和 PostgreSQL 8.3.3.
  • postgresql 服务器日志是否也显示错误,与您发送的 SQL 相同? (以防万一 SQL 在途中发生了什么事情......)

标签: java postgresql jdbc foreign-keys indexing


【解决方案1】:

不能像 Michal Niklas 那样对答案发表评论,但是您的 sql 语句在 postgres 中是非法的并且无法工作。我的猜测:

CREATE UNIQUE INDEX type_uk ON cell (field1, field2, field3, field4) TABLESPACE lcindex 
  where field3 is not null and field4 is not null;
  • tablespace 应该在 where 之前
  • where 子句中的每个字段都有 有“不为空”

【讨论】:

  • 好的,我会尽快尝试并回复你们,以便其他人知道这是否有效。非常感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多