Многостолбцовые индексы Grails - PullRequest
15 голосов
/ 02 октября 2009

Может кто-нибудь объяснить, как определять многостолбцовые индексы в Grails? Документация в лучшем случае скудная.

Это, например, вообще не работает: http://grails.org/GORM+Index+definitions

Мне повезло с этим, но результаты в лучшем случае кажутся случайными. Определения, которые работают в одном доменном классе, не применяются применительно к другому (с разными именами, конечно). http://www.grails.org/doc/1.1/guide/single.html#5.5.2.6%20Database%20Indices

Некоторые рабочие примеры и пояснения будут высоко оценены!

Ответы [ 4 ]

17 голосов
/ 22 апреля 2010

Решение, которое у меня работает для многостолбцовых индексов:

class ClassName {
    String name
    String description
    String state

    static mapping = {
        name index: 'name_idx'
        description index: 'name_idx'
        state index: 'name_idx'
    }
}

Это создает индекс с именем name_idx с тремя столбцами в индексе.

Недостаток: столбцы перечислены в индексе в алфавитном порядке, а не в том порядке, в котором они были введены.

6 голосов
/ 11 октября 2009

Чтобы сделать ваш индекс многостолбцовым, перечислите столбцы с разделителем-запятой (обратите внимание, пробел не ставится после запятой, чтобы избежать этой ошибки . Второй URL, на который вы указываете, попадает в ошибку, как она говорит :

index:'Name_Idx, Address_Index'

с пробелом; должно работать как

index:'Name_Idx,Address_Index'

Первым URL, на который вы указали, было предлагаемое изменение (я не верю, что оно реализовано в настоящее время, и не знаю, насколько вероятно, что оно когда-либо будет).

3 голосов
/ 18 сентября 2011

Мне нужно было иметь возможность контролировать порядок столбцов в моем индексе нескольких столбцов, а также сделать его уникальным. Я обошел ограничения GORM / Hibernate, создав индекс в Bootstrap с использованием прямого SQL:

class BootStrap {

    DataSource dataSource

    def init = { servletContext ->
        if (!MyModel.count()) { // new database
            createIndexes()
            ...
        }
    }

    private void createIndexes() {
        Sql sql = new Sql(dataSource)
        sql.execute("create unique index my_index on my_model(col1,col2);")
    }
3 голосов
/ 06 октября 2009

AFAIK, показанное index замыкание здесь никогда не было реализовано, поэтому эти примеры следует игнорировать (эта страница предназначена для обсуждения возможных реализаций, а не для документирования фактической реализации).

Правильный способ определения индекса из одного столбца name_idx для свойства name -

static mapping = {
      name index:'name_idx'
}

Извините, но я не знаю, как определить индекс из нескольких столбцов, попробуйте список рассылки Grails , если вы не получили ответа здесь. В маловероятном случае, когда многостолбцовые индексы не могут быть объявлены непосредственно в классах домена, вы можете определить их в файле SQL, который создает их, если они еще не существуют (или удаляет и заново создает их). Этот файл SQL может быть выполнен закрытием init в Bootstrap.groovy

...