Графические индексы Grails

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

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

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

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

Ответ 1

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

class ClassName {
    String name
    String description
    String state

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

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

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

Ответ 2

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

index:'Name_Idx, Address_Index'

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

index:'Name_Idx,Address_Index'

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

Ответ 3

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

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

static mapping = {
      name index:'name_idx'
}

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

Ответ 4

Мне нужно было контролировать порядок столбцов в моем многоколоночном индексе, а также сделать его уникальным. Я работал над ограничениями 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);")
    }