powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ошибка 150 при создании внешнего ключа
25 сообщений из 34, страница 1 из 2
Ошибка 150 при создании внешнего ключа
    #36430334
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При попытке создать внеший ключ таким вот запросом:
Код: 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
Ошибка 150 при создании внешнего ключа
    #36430350
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
долго перечислять варианты ошибок:
- тип таблицдолжен быть InnoDB
- типы полей в связи должны совпадать (включая UNSIGNED)
- т.д. и т.п.
приведите DDL ("SHOW CREATE TABLE ... ") для этих таблиц - сразу будет видно, Что и Поч'ем ...
...
Рейтинг: 0 / 0
Ошибка 150 при создании внешнего ключа
    #36430377
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Ошибка 150 при создании внешнего ключа
    #36430386
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Гoлдун , я бы на вашем месте попробовал создать эквивалентные по структуре таблицы, создать этот ключ и залить туда данные.
...
Рейтинг: 0 / 0
Ошибка 150 при создании внешнего ключа
    #36430896
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разнообразные обходные пути я могу придумать, спасибо. Но мне интересно, в чем именно тут проблема, как это локализовать и исправить непосредственно, а не обойти.
...
Рейтинг: 0 / 0
Ошибка 150 при создании внешнего ключа
    #36430904
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Гoлдун,
Посмотрите внимательно, может такой FK (с тем же именем) уже существует?...
...
Рейтинг: 0 / 0
Ошибка 150 при создании внешнего ключа
    #36430928
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ГoлдунНо мне интересно, в чем именно тут проблема, как это локализовать и исправить непосредственно, а не обойти.Ну вот в процессе контролируемой заливки данных и выяснится, на каких именно записях возникает проблема. Если, конечно, верить вашему "на пустой базе скрипт нормально выполнялся и FK создавался".
...
Рейтинг: 0 / 0
Ошибка 150 при создании внешнего ключа
    #36430945
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_UstinovАлександр Гoлдун,
Посмотрите внимательно, может такой FK (с тем же именем) уже существует?...
Смотрел внимательно. Не существует. Пробовал создать со случайным именем. Пофиг.
Мало того, вроде была еще одна точно такая ошибка при попытке создать другой FK c двумя другими таблицами. Тоже заполненными
...
Рейтинг: 0 / 0
Ошибка 150 при создании внешнего ключа
    #36430965
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но при этом нет однозначной связи типа "заполнено - не создается FK". По некоторым заполненным FK отлично создается. Но надо отметить, что там меньше записей было.

Может кто-нибудь подскажет хотя бы расшифровку - что значит ошибка 150?
...
Рейтинг: 0 / 0
Ошибка 150 при создании внешнего ключа
    #36430998
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Г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
Ошибка 150 при создании внешнего ключа
    #36431014
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
таблицы(а) у вас объемные, индекс тоже будет весить достаточно много. Проверьте квоты на директорию с базой данных (в самой ОС-Дебиан) и квоты на InnoDB в файле настроек my.cfg
А error 150 - это очень обширная ошибка, Гуглите - убедитесь сами.
...
Рейтинг: 0 / 0
Ошибка 150 при создании внешнего ключа
    #36431101
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinovтаблицы(а) у вас объемные, индекс тоже будет весить достаточно много.
100 - 200 тысяч записей - это объёмные???? Это пилотный проект, в рабочем режиме в упомянутых таблицах планируется по неск. миллионов записей. Насколько мне известно, там выделенный физический сервер под это, вполне мощный, адекватно предполагаемым нагрузкам.
Квот нет. Конфиг перепроверят еще.
...
Рейтинг: 0 / 0
Ошибка 150 при создании внешнего ключа
    #36431183
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно после выполнения вашего скрипта по созданию FK выполнить
Код: plaintext
SHOW INNODB STATUS;

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

Код: 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
Ошибка 150 при создании внешнего ключа
    #36431290
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ГoлдунПосказали обходное решение, которое помогло на всех таких ключах:Это решение не проверяет нарушение ключей уже имеющимися данными.


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

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

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

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

Код: 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
Ошибка 150 при создании внешнего ключа
    #36431681
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Гoлдун,

а покажите ваш конфиг
...
Рейтинг: 0 / 0
Ошибка 150 при создании внешнего ключа
    #36431779
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/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
Ошибка 150 при создании внешнего ключа
    #36431894
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Гoлдун,

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

Почему оно ругалось? Как этот бред диагностировать?
И вообще самый главный вопрос, который все больше беспокоит: Foreign Keys в MySQL вообще пригодны для реального использования или это чисто фича для галочки, чтоб не стыдно было перед конкурентами похвастаться, а все по привычке лепят MyISAM без ссылочной целостности?
...
Рейтинг: 0 / 0
Ошибка 150 при создании внешнего ключа
    #36437499
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит так, детали. Все та же таблица 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
25 сообщений из 34, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ошибка 150 при создании внешнего ключа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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