Уже много лет думаю перейти своим ноутбуком с 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 не будет работать!
Спасибо за помощь.
Сразу голову не включил, потом все получилось.
Вот так:
#/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