Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ошибка 150 при создании внешнего ключа / 25 сообщений из 34, страница 1 из 2
25.01.2010, 23:49
    #36430334
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
При попытке создать внеший ключ таким вот запросом:
Код: plaintext
1.
2.
3.
4.
5.
 ALTER TABLE book_categories
    ADD CONSTRAINT FK_BOOK_CATEGORIES2BOOKINFO FOREIGN KEY (book_id)
       REFERENCES BOOKINFO (book_id)
       ON DELETE CASCADE
       ON UPDATE RESTRICT;

сервер выдает такую ошибку:
Код: plaintext
1.
    [mysqld-5.0.51a-24+lenny2]Can't create table './test_db/#sql-2186_227d8.frm' (errno: 150)

При этом потенциальных нарушений будущего ключа нет, что подтверждается таким запросом:
Код: plaintext
1.
2.
    SELECT * FROM book_categories
    WHERE book_id NOT IN (SELECT book_id from bookinfo)

Куда копать? Задача усугубляется еще тем, что я не DBA и не root этого сервера, а те, кто его инсталлировали, возможно в MySQL разбираются еще меньше, чем я.
...
Рейтинг: 0 / 0
26.01.2010, 00:14
    #36430350
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
долго перечислять варианты ошибок:
- тип таблицдолжен быть InnoDB
- типы полей в связи должны совпадать (включая UNSIGNED)
- т.д. и т.п.
приведите DDL ("SHOW CREATE TABLE ... ") для этих таблиц - сразу будет видно, Что и Поч'ем ...
...
Рейтинг: 0 / 0
26.01.2010, 00:46
    #36430377
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE TABLE bookinfo (
  book_id           integer               not null,
  vendor_book_id       integer,
  title_main           varchar( 254 ) not null comment 'название',
  .... (выкусил несущественное для сокращения)....
  primary key (book_id)
)
ENGINE = InnoDB
CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE book_categories (
  book_id              INTEGER                         NOT NULL,
  group_id             INTEGER                         NOT NULL,
  sort_order           INTEGER,
PRIMARY KEY (book_id, group_id)
)
COMMENT = 'связь книг с классификацией'
ENGINE = InnoDB
CHARACTER SET utf8 COLLATE utf8_general_ci;

Первая таблица "широкая", больше 40 полей, несколько мемо-полей, около 70 тысяч записей. Второая - около 250 тысяч записей.

С метаданными все ОК. Сужу исключительно по тому, что на пустой базе скрипт нормально выполнялся и FK создавался. Потом временно потребовалось дропнуть ключ. И вот теперь по новой создать его не получается.
...
Рейтинг: 0 / 0
26.01.2010, 01:15
    #36430386
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Александр Гoлдун , я бы на вашем месте попробовал создать эквивалентные по структуре таблицы, создать этот ключ и залить туда данные.
...
Рейтинг: 0 / 0
26.01.2010, 11:50
    #36430896
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Разнообразные обходные пути я могу придумать, спасибо. Но мне интересно, в чем именно тут проблема, как это локализовать и исправить непосредственно, а не обойти.
...
Рейтинг: 0 / 0
26.01.2010, 11:53
    #36430904
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Александр Гoлдун,
Посмотрите внимательно, может такой FK (с тем же именем) уже существует?...
...
Рейтинг: 0 / 0
26.01.2010, 11:59
    #36430928
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Александр ГoлдунНо мне интересно, в чем именно тут проблема, как это локализовать и исправить непосредственно, а не обойти.Ну вот в процессе контролируемой заливки данных и выяснится, на каких именно записях возникает проблема. Если, конечно, верить вашему "на пустой базе скрипт нормально выполнялся и FK создавался".
...
Рейтинг: 0 / 0
26.01.2010, 12:02
    #36430945
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Alex_UstinovАлександр Гoлдун,
Посмотрите внимательно, может такой FK (с тем же именем) уже существует?...
Смотрел внимательно. Не существует. Пробовал создать со случайным именем. Пофиг.
Мало того, вроде была еще одна точно такая ошибка при попытке создать другой FK c двумя другими таблицами. Тоже заполненными
...
Рейтинг: 0 / 0
26.01.2010, 12:06
    #36430965
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Но при этом нет однозначной связи типа "заполнено - не создается FK". По некоторым заполненным FK отлично создается. Но надо отметить, что там меньше записей было.

Может кто-нибудь подскажет хотя бы расшифровку - что значит ошибка 150?
...
Рейтинг: 0 / 0
26.01.2010, 12:15
    #36430998
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Александр ГoлдунМожет кто-нибудь подскажет хотя бы расшифровку - что значит ошибка 150? http://dev.mysql.com/doc/refman/5.0/en/innodb-error-codes.html
http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html
искать в тексте по числу 150.
...
Рейтинг: 0 / 0
26.01.2010, 12:19
    #36431014
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
таблицы(а) у вас объемные, индекс тоже будет весить достаточно много. Проверьте квоты на директорию с базой данных (в самой ОС-Дебиан) и квоты на InnoDB в файле настроек my.cfg
А error 150 - это очень обширная ошибка, Гуглите - убедитесь сами.
...
Рейтинг: 0 / 0
26.01.2010, 12:48
    #36431101
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Alex_Ustinovтаблицы(а) у вас объемные, индекс тоже будет весить достаточно много.
100 - 200 тысяч записей - это объёмные???? Это пилотный проект, в рабочем режиме в упомянутых таблицах планируется по неск. миллионов записей. Насколько мне известно, там выделенный физический сервер под это, вполне мощный, адекватно предполагаемым нагрузкам.
Квот нет. Конфиг перепроверят еще.
...
Рейтинг: 0 / 0
26.01.2010, 13:09
    #36431183
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Можно после выполнения вашего скрипта по созданию FK выполнить
Код: plaintext
SHOW INNODB STATUS;

И анализируйте ответ сервера.
...
Рейтинг: 0 / 0
26.01.2010, 13:22
    #36431234
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Посказали обходное решение, которое помогло на всех таких ключах:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SET FOREIGN_KEY_CHECKS= 0 ;

ALTER TABLE book_categories
    ADD CONSTRAINT FK_BOOK_CATEGORIES2BOOKINFO FOREIGN KEY (book_id)
       REFERENCES BOOKINFO (book_id)
       ON DELETE CASCADE
       ON UPDATE RESTRICT;

SET FOREIGN_KEY_CHECKS= 1 ;
Отлично прошло!
Но перед этим я ещё раз перепроверил, нет ли нарушений этого ключа. Их ТОЧНО нет.

В чем могла быть эта проблема? "Родовая травма" MySQL с InnoDb, как мне подсказали? Как выяснилось, не у меня одного подобные проблемы были.
...
Рейтинг: 0 / 0
26.01.2010, 13:36
    #36431290
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Александр ГoлдунПосказали обходное решение, которое помогло на всех таких ключах:Это решение не проверяет нарушение ключей уже имеющимися данными.


Александр ГoлдунНо перед этим я ещё раз перепроверил, нет ли нарушений этого ключа. Их ТОЧНО нет.Проверьте план этого проверочного запроса. Измените запрос так, чтобы не могли использоваться индексы и сравните результат. Отдельно проверьте наличие NULL-ов в обоих полях book_id.
...
Рейтинг: 0 / 0
26.01.2010, 14:20
    #36431435
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Какие NULL в первичном ключе? Вы о чем? Вы такие страшные вещи говорите, что у меня начинают закрадываться еще более жуткие сомнения по поводу MySQL

Тем не менее, запустил проверочный запрос:
Код: plaintext
1.
2.
SELECT * FROM book_categories
    WHERE (book_id+ 1 ) NOT IN (SELECT (book_id+ 1 ) from bookinfo)
Он до сих пор идет, но вряд ли что-то найдется. А упомянутая ошибка мгновенно выскакивала.
...
Рейтинг: 0 / 0
26.01.2010, 14:23
    #36431449
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Александр ГoлдунКакие NULL в первичном ключе? Вы о чем? Вы такие страшные вещи говорите, что у меня начинают закрадываться еще более жуткие сомнения по поводу MySQL О том, что таблица или какой-то из ее индексов могли быть повреждены.
...
Рейтинг: 0 / 0
26.01.2010, 15:03
    #36431577
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Могу поверить в случайное повреждение одного индекса в одной таблице. Но не в нескольких же, особенно в несвязанных между собой!

Нет, тут явно проблема в чем-то другом. Может в каких-то настройках? Чего ему не хватает?

Из статистики смутил такой раздел:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
__ InnoDB Buffer Pool __________________________________________________
 Usage           8.00M of   8.00M  %Used: 100.00 
Read hit       99.78%
Pages
  Free              0            %Total:   0.00
  Data            500                     97.66 %Drty:   0.00
  Misc             12                      2.34
  Latched           0                      0.00
Reads          65.48G   42.6k/s
  From file   143.78M    93.4/s            0.22
  Ahead Rnd   9784649     6.4/s
  Ahead Sql  63995308    41.6/s
Writes         20.93M    13.6/s
Flushes       418.29k     0.3/s
Wait Free           0       0/s

Выделенное - это нормально?
...
Рейтинг: 0 / 0
26.01.2010, 15:36
    #36431681
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Александр Гoлдун,

а покажите ваш конфиг
...
Рейтинг: 0 / 0
26.01.2010, 16:05
    #36431779
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
/etc/mysql$ cat my.cnf | grep -v '#'
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock


[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
language        = /usr/share/mysql/english
skip-external-locking
key_buffer              = 32M
max_allowed_packet      = 32M
thread_stack            = 128K
thread_cache_size       = 8
query_cache_limit       = 2M
query_cache_size        = 32M
expire_logs_days        = 10
max_binlog_size         = 100M
skip-bdb



[mysqldump]
quick
quote-names
max_allowed_packet      = 16M

[mysql]

[isamchk]
key_buffer              = 16M
...
Рейтинг: 0 / 0
26.01.2010, 16:53
    #36431894
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Александр Гoлдун,

у вас под InnoDB вообще настроек нет.
я бы рекомендовал начать с innodb_buffer_pool_size
...
Рейтинг: 0 / 0
27.01.2010, 12:40
    #36433350
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Получается, совершенно дефолтные настройки. InnoDB не должен нормально работать с настройками по-умолчанию?
...
Рейтинг: 0 / 0
27.01.2010, 12:42
    #36433356
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Александр ГoлдунInnoDB не должен нормально работать с настройками по-умолчанию?По современным меркам - нет.
...
Рейтинг: 0 / 0
29.01.2010, 00:19
    #36437478
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Просто засада какая-то! Создал ключ вышеописанным способом. Разумеется, убедился и до и после, что он не нарушается.
Пытаюсь залить данные - ругается на нарушение этого первичного ключа. Думал, может ошибка в программе. Для диагностики убрал снова этот FK, чтобы можно было увидеть записи, которые его нарушили. Прошла заливка. Смотрю записи - а нарушений то нет!!!

Почему оно ругалось? Как этот бред диагностировать?
И вообще самый главный вопрос, который все больше беспокоит: Foreign Keys в MySQL вообще пригодны для реального использования или это чисто фича для галочки, чтоб не стыдно было перед конкурентами похвастаться, а все по привычке лепят MyISAM без ссылочной целостности?
...
Рейтинг: 0 / 0
29.01.2010, 00:46
    #36437499
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 150 при создании внешнего ключа
Значит так, детали. Все та же таблица bookinfo, таблица book_persons, FK между ними:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
CREATE TABLE bookinfo (
  book_id           integer               not null,
  vendor_book_id       integer,
  title_main           varchar( 254 ) not null comment 'название',
  .... (выкусил несущественное для сокращения)....
  primary key (book_id)
)
ENGINE = InnoDB
CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE book_persons (
  person_id            integer                         not null,
  book_id              integer                         not null,
  role_id    integer not null comment 'роль',
  sort_order           integer                         not null,
primary key (book_id, person_id, role_id)
)
COMMENT = 'Связь Персоны-Книги-Роли'
ENGINE = InnoDB
CHARACTER SET utf8 COLLATE utf8_general_ci;


ALTER TABLE book_persons
   ADD CONSTRAINT FK_BOOK_PERS2BOOKINFO FOREIGN KEY (book_id)
      REFERENCES BOOKINFO (book_id)
      ON DELETE CASCADE
      ON UPDATE RESTRICT;

FK как раз пришлось создавать описанным способом через Ж. Нарушений этого FK нет.

Выполняю запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
REPLACE INTO book_persons(
  person_id,
  role_id,
  book_id
)VALUES(
   269 ,
   296 ,
   5488 
)
Получаю ошибку:
[mysqld-5.0.51a-24+lenny2]Cannot add or update a child row: a foreign key constraint fails
(`db_books/book_persons`, CONSTRAINT `FK_BOOK_PERS2BOOKINFO` FOREIGN KEY (`book_id`) REFERENCES `BOOKINFO` (`book_id`) ON DELETE CASCADE)

Т.е. явно ругается на этот FK. А такое может быть только в том случае, если отсутствует родительская запись с book_id=5488. Что я и проверяю запросом в том же сеансе:
Код: plaintext
SELECT * FROM bookinfo WHERE book_id =  5488 
и вижу искомую запись в наличии!!!

Что с этим делать?
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ошибка 150 при создании внешнего ключа / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]