Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание внешнего ключа через ALTER. 
V
    Опции темы
Avaj
Дата 9.3.2010, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 14.7.2008
Где: Владивосток.

Репутация: нет
Всего: 3



Здравствуйте, нужна помощь:

В базе Images есть таблицы Image(image_id, ...),                   User(user_id, ....),             user_image(image_id, user_id) - ну понятно, есть пользователи, изображения и взаимосвязь - много-много.

Так как же мне в уже существующей таблице user_login сделать оба поля image_id, user_id внешними ключами, чтоб ссылались на соответствующие поля таблиц Image и User. Это мне надо для каскадного удаления, да и вообще...

Я пытался делать такой запрос:

Код

ALTER TABLE user_image
ADD CONSTRAINT
FOREIGN KEY (image_id) REFERENCES Image (image_id)
,


но возникает какая-то невероятная ошибка "1005 Can't create table './Images/#sql-96f_28frm' (errno: 150)".


PM MAIL   Вверх
skyboy
Дата 9.3.2010, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



уточняй версию. 
Цитата(Avaj @  9.3.2010,  13:20 Найти цитируемый пост)
какая-то невероятная ошибка

на самом деле - ничего невероятного: сначала создается frm c новым описанием структуры таблицы, а только потом - заменяется существующий.
соответственно, это просто не информативное сообщение об ошибке. проблема может быть как с новой структурой, так и с файловой системой(нехватка места, прав и т.д.)
вообще говоря, варианты есть разные

Добавлено @ 14:40
на forum.mysql.com в обсуждении подобной проблемы напоминают следующие нюансы:
Цитата

The field being referenced as a FK, in the PARENT table, needs to be
1) either a AI or UQ
2) It has to be the same "data type" and equal in ALL respects (VARCHAR(xx)) in BOTH the field in the parent table and the FK in the child table
3) Make sure that the "Collation" is ALSO the same (latin 1 or UTF8 are the most common ones). To ensure sanity make everything the same (you can do this at the table level or at field level). BUT what is critical is that the parent AND child tables have to be the same, IF NOT the field in the parent table and the FK field in the child table has to be the same.
4) Engine has to be InnoDB
5) IF you are using a field from a table as a FK in more than one table, then make sure that the "Foreign Key Name" (a column in the MySQL Workbench) is unique. IF you use the same FK Name, it will fail.


PM MAIL   Вверх
Avaj
Дата 9.3.2010, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 14.7.2008
Где: Владивосток.

Репутация: нет
Всего: 3



Да, действительно много вариантов возникновения ошибки.

Правильно ли я понимаю эти 5 пунктов?

Цитата

Цитата

The field being referenced as a FK, in the PARENT table, needs to be
1) either a AI or UQ
2) It has to be the same "data type" and equal in ALL respects (VARCHAR(xx)) in BOTH the field in the parent table and the FK in the child table
3) Make sure that the "Collation" is ALSO the same (latin 1 or UTF8 are the most common ones). To ensure sanity make everything the same (you can do this at the table level or at field level). BUT what is critical is that the parent AND child tables have to be the same, IF NOT the field in the parent table and the FK field in the child table has to be the same.
4) Engine has to be InnoDB
5) IF you are using a field from a table as a FK in more than one table, then make sure that the "Foreign Key Name" (a column in the MySQL Workbench) is unique. IF you use the same FK Name, it will fail.



1) а первичным ключом не может быть?

3) Кодировка должна быть у обеих таблиц одинаковой или у обоих столбцов.

И вот ещё нашёл тут :

Цитата

Если оператор MySQL CREATE TABLE выдает ошибку с номером 1005, и в строке сообщения об ошибке присутствует ссылка на ошибку с номером 150, то произошел сбой создания таблицы из-за того, что ограничения внешнего ключа не были сформированы надлежащим образом. Аналогично и для оператора ALTER TABLE: если происходит ошибка при выполнении оператора и в сообщении присутствует ссылка на ошибку с номером 150, то определение внешнего ключа для преобразовываемой таблицы сформировано неправильно. 


"определение внешнего ключа для преобразовываемой таблицы сформировано неправильно" - а правильно это по тем 5 пунктам?

И можно ли ещё как-то сделать внешний ключ и каскадное удаление?

Это сообщение отредактировал(а) Avaj - 9.3.2010, 16:27
PM MAIL   Вверх
skyboy
Дата 9.3.2010, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(Avaj @  9.3.2010,  15:12 Найти цитируемый пост)
Кодировка должна быть у обеих таблиц одинаковой или у обоих столбцов

да, и кодировка(charset), и сравнение(collation)
может, приведешь create table обоих таблиц?
к слову, наверное, лучше уж апеллировать к ману с его "Foreign key contraints". там список ограничений побольше.
например, упущенное в блоке выше "обе таблицы должны быть innoDB и не быть временными(temporary)"
PM MAIL   Вверх
Avaj
Дата 9.3.2010, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 14.7.2008
Где: Владивосток.

Репутация: нет
Всего: 3



Код

CREATE TABLE  `Images`.`user` (
  `UserLogin` varchar(30) NOT NULL,
  `Password` varchar(30) NOT NULL,
  `FirstName` varchar(30) NOT NULL,
  `LastName` varchar(30) NOT NULL,
  `Country` varchar(30) NOT NULL,
  `State` varchar(30) NOT NULL,
  `City` varchar(30) NOT NULL,
  `Street` varchar(30) NOT NULL,
  `HouseNumber` int(10) unsigned NOT NULL,
  `ApNumber` int(10) unsigned default NULL,
  `Email` varchar(30) NOT NULL,
  `PhoneNumber` varchar(30) NOT NULL,
  `URL` varchar(30) NOT NULL,
  `Status` varchar(6) NOT NULL,
  `Balance` int(10) unsigned NOT NULL,
  PRIMARY KEY  USING BTREE (`UserLogin`),
  KEY `new_index` (`UserLogin`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE  `Images`.`user_image` (
  `UserLogin` varchar(30) character set utf8 collate utf8_bin NOT NULL,
  `ImageID` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8



Тут пользователи user и отношение к изображениям user_image .

Странно это : 
Цитата
 
 `UserLogin` varchar(30) character set utf8 collate utf8_bin NOT NULL,
, т.к. в MySQL Query Browser показывает, что  collate выставлен на всю таблицу - utf_general_ci и ещё charset - utf8. А тут ещё и отдельно charset. Это ведь ненормально? Убрать только через ALTER?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0480 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.