powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Не получается связать таблицы.
8 сообщений из 8, страница 1 из 1
Не получается связать таблицы.
    #38467027
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Есть база данных warehouses .
Далее создаю две таблицы Register и Operations.
в Register назначаю поля для primary key:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
mysql> desc Register
    -> ;
+-------------+---------+------+-----+---------+-------+
| Field       | Type    | Null | Key | Default | Extra |
+-------------+---------+------+-----+---------+-------+
| id          | int(11) | NO   | PRI | NULL    |       |
| Date        | date    | YES  |     | NULL    |       |
| FromStockId | int(11) | NO   | PRI | NULL    |       |
| ToStockId   | int(11) | NO   | PRI | NULL    |       |
| WareId      | int(11) | NO   | PRI | NULL    |       |
| UnitId      | int(11) | NO   | PRI | NULL    |       |
| Quantity    | int(11) | NO   |     | NULL    |       |
| OperationId | int(11) | NO   | PRI | NULL    |       |
| Cost        | int(11) | NO   |     | NULL    |       |
+-------------+---------+------+-----+---------+-------+
9 rows in set (0,08 sec)



структура таблицы Operations:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
mysql> desc Operations;
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| OperationId | int(11)     | NO   |     | NULL    |       |
| OperAction  | varchar(16) | YES  |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+
2 rows in set (0,00 sec)

mysql> 



После пытаюсь назначить foreign key и references делаю:
Код: sql
1.
mysql> alter table Operations add foreign key (OperationId) references Register (OperationId);



Выдает ошибку:
Код: sql
1.
ERROR 1005 (HY000): Can't create table 'warehouses.#sql-13a3c_c' (errno: 150)



Ткните где ошибся?
...
Рейтинг: 0 / 0
Не получается связать таблицы.
    #38467054
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, foreign key должен ссылаться на первичный (или уникальный) ключ целиком, а не на его часть.
Во-вторых, а почему в первой таблиц первичный ключ из кучи полей (явно в нем лишних), а во второй отсутствует полностью?
...
Рейтинг: 0 / 0
Не получается связать таблицы.
    #38467070
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВо-первых, foreign key должен ссылаться на первичный (или уникальный) ключ целиком, а не на его часть.


Документация:

Код: html
1.
2.
 ADD [CONSTRAINT [symbol]] PRIMARY KEY
        [index_type] (index_col_name,...) [index_option] ...



Код: html
1.
2.
3.
4.
5.
6.
ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]



Это не так случайно [index_type] = tbl_name ???

Странно а это что тогда?
REFERENCES tbl_name (index_col_name,...) -- У меня вроде так же написано.

Т.Е перечислять все поля которые принадлежат pr key таблицы Registry так:?
Код: sql
1.
............references Register (OperationId, FromStockId, ToStockId ....итд); 




авторВо-вторых, а почему в первой таблиц первичный ключ из кучи полей (явно в нем лишних), а во второй отсутствует полностью?
Почему явно лишних ?
Вот моя sql схема:


автора во второй отсутствует полностью?
А это обязательное условие?
...
Рейтинг: 0 / 0
Не получается связать таблицы.
    #38467095
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.Hofmann,

Уточнил в документации, формально требование не столько строгое. Ссылаться можно на первые (или все) колонки индекса. Однако есть специальная оговорка:
http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html You are advised to use foreign keys that reference only UNIQUE (including PRIMARY) and NOT NULL keys.

Второе, судя по представленной схеме, ссылка должна быть в обратную сторону, т.е. такая:
Код: sql
1.
alter table Register Operations add foreign key (OperationId) references Operations (OperationId);

А поле OperationId в таблице Operations должно быть первичным ключом.

Третье, в таблице Register в первичном ключе достаточно поля id, особенно, если оно автоинкрементное. Другие поля втаскивать в первичный ключ не вижу никакого смысла.
...
Рейтинг: 0 / 0
Не получается связать таблицы.
    #38467144
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.Hofmann,

Обычно отношение ставят следом за примари в referenced_table_name и связывают с примари в table_name, при этом referenced_column_name обязательно совпадает по типу с column_name и не обязательно но желательно проиндексировано в referenced_table_name. После чего добавляют fk по схеме и никаких проблем не испытывают. Будьте как все и полегчает.
...
Рейтинг: 0 / 0
Не получается связать таблицы.
    #38467323
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft
Второе, судя по представленной схеме, ссылка должна быть в обратную сторону, т.е. такая:
[src]
alter table Register Operations add foreign key (OperationId) references Operations (OperationId);


Я так понял здесь ошибка:
alter table Register Operations??? add foreign key (OperationId) references Operations (OperationId);

Вроде читал что должно появиться поле MUL столбец KEY в описании таблицы но чета ничего подобного не наблюдается.
Как определяете что в таблице есть foreign key?
...
Рейтинг: 0 / 0
Не получается связать таблицы.
    #38467456
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.HofmannmiksoftВторое, судя по представленной схеме, ссылка должна быть в обратную сторону, т.е. такая:
Код: sql
1.
alter table Register Operations add foreign key (OperationId) references Operations (OperationId);

Я так понял здесь ошибка:
alter table Register Operations??? add foreign key (OperationId) references Operations (OperationId);Да, напутал при копипасте
Код: sql
1.
alter table Register add foreign key (OperationId) references Operations (OperationId);
...
Рейтинг: 0 / 0
Не получается связать таблицы.
    #38482720
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТретье, в таблице Register в первичном ключе достаточно поля id, особенно, если оно автоинкрементное. Другие поля втаскивать в первичный ключ не вижу никакого смысла.
Да действительно так - спасибо за совет.

Вот переделал схему:

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


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