MySQL, InnoDB, Foreign keys и большие буквы

Уже много лет думаю перейти своим ноутбуком с Windows на другую опереционку, да хоть на MacOS, но все как то не судьба. Сижу себе на Windows, под ним и занимаюсь разработкой.

Стоит у меня на ноуте, в том числе и MySQL, c настройкой lower_case_table_names=0. Нравятся мне таблицы с большими буквами в именах. И все бы ничего, но когда заливаешь на Unix хост дамп с такой базы, начинаются чудеса. При добавлении совершенно нормальных данных, которые должны проходить foreign key checks возникает ошибка:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`xxx`.`Documents`, CONSTRAINT `fk_Documents_Users` FOREIGN KEY (`userID`) REFERENCES `users` (`userID`) ON DELETE NO ACTION ON UPDATE NO ACTION)

Причина ошибки в том, что mysqldump создает определения внешних ключей с именем таблицы в нижнем регистре:

CONSTRAINT `fk_Documents_Users` FOREIGN KEY (`userID`) REFERENCES `users` (`userID`) ON DELETE NO ACTION ON UPDATE NO ACTION

В данном случае таблица должны называться Users (с большой буквы). Пичалька. Когда у тебя дамп из двух таблиц, это можно пережить. Если изменить в дампе регистр  букв в именах таблиц на правильный, то все отлично.

Когда таблиц 10, это начинает напрягать. Когда их становится 15, лично я написал скрипт, который в 5 сек. решает эту проблему:

unix-shema.sh

#/bin/sh

cat shema.sql | awk '/CREATE TABLE/ {print $3}' | sed -f unix-shema.sed > /tmp/unix-shema.sed
cat shema.sql | sed -f /tmp/unix-shema.sed

unix-shema.sed

s!\(.*\)!s/REFERENCES \1/REFERENCES \1/I!

Суть такая. Из файла shema.sql выдергиваются все имена таблиц, на их основании формируется список регулярных выражений, которые заменяют имена таблиц в строках с  REFERENCES.

Наслаждайтесь.

PS. На FreeBSD не будет работать!

Запись опубликована в рубрике ЧАВО. Добавьте в закладки постоянную ссылку.

Один комментарий: MySQL, InnoDB, Foreign keys и большие буквы

  1. Денис говорит:

    Спасибо за помощь.
    Сразу голову не включил, потом все получилось.
    Вот так:

    #/bin/sh

    cat 11.sql | awk ‘/CREATE TABLE/ {print $3}’ | sed -f unix-shema.sed > /tmp/unix-shema.sed
    cat 11.sql | sed -f /tmp/unix-shema.sed 11.sql > 111.sql

Добавить комментарий для Денис Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>