Индексы Grails с несколькими столбцами
Вопрос
Кто-нибудь может объяснить, как определить многоколоночные индексы в Grails?Документация в лучшем случае скудна.
Это, например, похоже, вообще не работает:http://grails.org/GORM+Index+definitions
Мне немного повезло с этим, но результаты в лучшем случае кажутся случайными.Определения, которые работают в одном классе домена, этого не делают, когда применяются к другому (с разными именами, конечно).http://www.grails.org/doc/1.1/guide/single.html#5.5.2.6%20Database%20Indices
Мы были бы весьма признательны за некоторые рабочие примеры и пояснения!
Решение
Решение, которое сработало для меня для многоколоночных индексов, является:
class ClassName {
String name
String description
String state
static mapping = {
name index: 'name_idx'
description index: 'name_idx'
state index: 'name_idx'
}
}
Это создает индекс с именем 'name_idx' с тремя столбцами в индексе.
Обратная сторона:столбцы перечислены в индексе в алфавитном порядке, а не в том порядке, в котором они были введены.
Другие советы
Чтобы сделать ваш индекс многоколоночным, перечислите столбцы через разделитель-запятую (обратите внимание, без пробела после запятой, чтобы избежать этот баг.Второй URL-адрес, на который вы указываете, указывает на ошибку, как там написано:
index:'Name_Idx, Address_Index'
с пробелом;это должно работать как
index:'Name_Idx,Address_Index'
Первый URL-адрес, на который вы указали, был предлагаемым изменением (я не верю, что оно реализовано в настоящее время, и понятия не имею, насколько вероятно, что оно когда-либо будет).
AFAIK, в index
показанное закрытие здесь никогда не был реализован, поэтому эти примеры следует игнорировать (эта страница предназначена для обсуждения возможных реализаций, а не для документирования фактической реализации).
Правильный способ определения индекса с одним столбцом name_idx
для name
свойство является
static mapping = {
name index:'name_idx'
}
Извините, но я не знаю, как определить многоколоночный индекс, попробуйте Список рассылки Grails если вы не получите ответа здесь.В маловероятном случае, если многоколоночные индексы не могут быть объявлены непосредственно в классах домена, вы могли бы определить их в файле SQL, который создает их, если они еще не существуют (или удаляет и создает заново).Этот SQL-файл может быть выполнен с помощью init
закрытие в Bootstrap.groovy
Мне нужно было иметь возможность контролировать порядок столбцов в моем многоколоночном индексе, а также сделать его уникальным.Я обошел ограничения 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);")
}