2013-09-04 28 views
7

Tôi đang khởi tạo một cơ sở dữ liệu HSQL 2.2.9 qua mùa xuân sử dụngHSQL: Tạo chỉ số nếu không tồn tại

<jdbc:initialize-database enabled="true"> 
    <jdbc:script execution="INIT" location="classpath:./create-tables.sql" /> 
</jdbc:initialize-database> 

Trong tạo-tables.sql tôi sử dụng

CREATE TABLE IF NOT EXISTS MyTable(...); 

Bảng này cũng có mục lục. Tôi đang tìm kiếm một cách tốt hơn là luôn giảm và tạo chỉ mục.

tôi đã cố gắng:

CREATE INDEX IF NOT EXISTS myIndex ...; 
  • không hoạt động

tôi có thể tạo một hàm indexExisting() kiểm tra các bảng hệ thống và trở count (*)> 0 nếu chỉ số được tìm thấy , nhưng nếu tôi viết

IF indexExisting() = 0 THEN ... 

trực tiếp vào tệp .sql, nó nói

java.sql.SQLSyntaxErrorException: unexcepted token: IF 

Quy trình lưu trữ dường như không hữu ích, vì chúng có thể không chứa câu lệnh DROP, theo như tôi đọc.

Vì vậy, một giải pháp khác ngoài việc giảm/tạo chỉ mục sẽ được đánh giá cao.

Cảm ơn bạn

+0

Tôi muốn chạy tất cả các báo cáo schema di cư sử dụng một công cụ như Liquibase hoặc bay theo trục mà theo dõi những gì đã được áp dụng và Những gì cần phải được thực hiện. –

+0

Cảm ơn bạn, tôi sẽ kiểm tra những công cụ đó. Tập lệnh sql có một lỗ hổng khác, ném một ngoại lệ khi cố gắng xóa chỉ mục chưa tồn tại. Bây giờ, tôi đã thay đổi nó để bắt đầu các bảng và các chỉ mục thông qua lớp, trong đó có thể bắt được ngoại lệ. – pma

+1

'chỉ mục thả nếu tồn tại my_index' sẽ hoạt động theo cách mong đợi. Tuy nhiên, 'tạo chỉ mục nếu không tồn tại my_index trên my_table (my_column)' sẽ tạo một chỉ mục có tên 'if'. Nó sẽ có các đặc điểm chính xác mà bạn dự định, ngoại trừ tên và thực tế là nó được tạo ra vô điều kiện và sẽ thất bại nếu được thực hiện hai lần. Vẫn đang tìm kiếm một giải pháp bản thân - giảm và tái tạo chỉ mục mỗi lần có thể nhận được khá đắt trên một DB lớn. – user149408

Trả lời

3

Phiên bản mới nhất của HSQLDB hỗ trợ cả:

CREATE INDEX IF NOT EXISTS myIndex ... 
DROP INDEX IF EXISTS myIndex 
+0

Thử nghiệm nó với V 2.3.4 thông qua trình quản lý cơ sở dữ liệu swing – pma

+1

Thực ra, tôi nhận được hành vi lạ. Nếu tôi sử dụng 'tạo chỉ mục nếu không tồn tại ix_test1 trên test_table (field1, field2)' Tôi kết thúc với một chỉ mục có tên 'if' và chạy lệnh một lần nữa tôi nhận được' tên đối tượng đã tồn tại'. Sử dụng HSQL 2.3.3. –

+1

Thử 2.3.4, không phải 2.3.3. – fredt

Các vấn đề liên quan