![]() |
![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Всем привет!
Не могли бы вы подсказать, не могу сообразить следующее. Имеется две таблицы:
Отредактированно FiMko (01.05.2013 16:16:40)
Неактивен
Условие, не связывающее таблицы, разумнее перенести в WHERE, а связывающее - в ON. Так будет лучше?
Неактивен
rgbeast написал:
Условие, не связывающее таблицы, разумнее перенести в WHERE, а связывающее - в ON. Так будет лучше?
rgbeast, спасибо за помощь! Попробовал, результат тот же - 80125.
Остаются, конечно, prepared statements, но я не теряю надежды найти способ как это лечить на уровне запроса.
--- добавлено ---
Что-то я совсем не понимаю:
Отредактированно FiMko (01.05.2013 16:38:49)
Неактивен
COLLATE utf8_general_ci - это преобразование, которое не позволяет использовать индекс. EXPLAIN дает приблизительное число строк, поэтому может быть и больше, чем в таблице.
Неактивен
rgbeast написал:
COLLATE utf8_general_ci - это преобразование, которое не позволяет использовать индекс. EXPLAIN дает приблизительное число строк, поэтому может быть и больше, чем в таблице.
Вот это для меня новость! Тогда есть проблема другого рода:
В таблице words не должно быть дубликатов, при этом дубликатами являются только одинаковые слова в том же регистре (напр. "Test" и "Test" - дубликаты, а "Test" и "test" - нет). Контролировать подобное хотелось на уровне схемы базы, не в логике. CHARACTER SET utf8 COLLATE utf8_bin для таблицы words в паре с UNIQUE KEY на колонку words.word позволяли решить эту задачу.
Теперь, если для таблицы words поставить CHARACTER SET utf8 COLLATE utf8_general_ci и оставить UNIQUE KEY на колонку words.word, слова "test" и "Test" будут считаться дубликатами при добавлении. Если убрать ключ UNIQUE KEY, то надо как-то контролировать уникальность добавляемых слов. Триггер?
Можете посоветовать какое-то приемлемое решение?
Отредактированно FiMko (01.05.2013 18:11:53)
Неактивен
Если слов немного, можно, например, хранить в двух экземплярах - CS и CI
Неактивен
rgbeast написал:
Если слов немного, можно, например, хранить в двух экземплярах - CS и CI
Очень много слов должно быть в перспективе (миллионы). Но вставка достаточно редкое явление, в основном - чтение.
Неактивен
Значит проверять уникальность триггером или на уровне приложения
Неактивен
rgbeast написал:
Значит проверять уникальность триггером или на уровне приложения
Супер! Большое спасибо за помощь и подробное объяснение!
Неактивен
rgbeast написал:
Значит проверять уникальность триггером или на уровне приложения
К сожалению, если проверять уникальность триггером, упираемся в ограничение - Trigger to silently ignore/delete duplicate entries on INSERT. Невозможно, как в случае с использованием UNIQUE KEY, silently осуществить INSERT IGNORE INTO table... у которой есть триггер, прерывающий вставку. В случае с триггером в любом случае будет сгенерирована ошибка. Похоже придется лезть и менять что-то на уровне приложения, а так не хотелось
--- добавлено ---
В итоге обернул add_word в хранимую процедуру со всеми необходимыми проверками.
Отредактированно FiMko (04.05.2013 16:16:25)
Неактивен