Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ошибка с ключами (Foreign key) / 10 сообщений из 10, страница 1 из 1
24.11.2016, 13:09
    #39353581
woody19rus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с ключами (Foreign key)
Приветствую, помогите исправить ошибки в коде, не выходит создать связи показывает ошибку:
(Error Code : 1005
Can't create table 'lyabon.#sql-50c_2a' (errno: 150)
...
Рейтинг: 0 / 0
24.11.2016, 13:11
    #39353584
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с ключами (Foreign key)
woody19rus,

где DDL таблиц?
Обычная грабля - колонки имеют разные типы (с учётом модификтора unsigned)
...
Рейтинг: 0 / 0
24.11.2016, 13:16
    #39353588
woody19rus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с ключами (Foreign key)
Melkij,
Код: plsql
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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
drop database if exists `LyaBon`;
create database `LyaBon` character set utf8 collate utf8_general_ci;
use `LyaBon`;

CREATE TABLE `Measure` (
	`ID` INT(20) NOT NULL AUTO_INCREMENT,
	`Name_of_measure` VARCHAR(255),
	`Short_title` VARCHAR(255),
	PRIMARY KEY (`ID`)
)engine=InnoDB default charset=cp1251;


CREATE TABLE `Nomenclature` (
	`ID` INT(20) NOT NULL AUTO_INCREMENT,
	`Name` VARCHAR(255),
	`Article` INT(20),
	`Name_of_measure` integer REFERENCES `Measure` (`ID`),
	`Consignment` VARCHAR(255),
	`Comment` VARCHAR(255),
	PRIMARY KEY (`ID`)

)engine=InnoDB default charset=cp1251;



CREATE TABLE `Good_movement` (
	`ID` INT(20) NOT NULL AUTO_INCREMENT,
	`Movement_date` DATE NOT NULL,
	`Count` INT(20),
	`Price` INT(20),
	`Code_of_supplier` INT(20) NOT NULL,
	`Code_of_operation` INT(20) NOT NULL,
	`Code` INT(20) NOT NULL,
	PRIMARY KEY (`ID`)
)engine=InnoDB default charset=cp1251;


CREATE TABLE `Requests` (
	`ID` INT(20) NOT NULL AUTO_INCREMENT,
	`Date_of_request` DATE,
	`Code` INT(20) NOT NULL,
	`Code_of_supplier` INT(20) NOT NULL,
	PRIMARY KEY (`ID`)
)engine=InnoDB default charset=cp1251;



CREATE TABLE `Operations` (
	`ID` INT(20) NOT NULL AUTO_INCREMENT,
	`Name_of_operation` VARCHAR(255),
	PRIMARY KEY (`ID`)
)engine=InnoDB default charset=cp1251;



CREATE TABLE `Suppliers` (
	`ID` INT(20) NOT NULL AUTO_INCREMENT,
	`Name_of_supplier` VARCHAR(255) NOT NULL,
	PRIMARY KEY (`ID`)
)engine=InnoDB default charset=cp1251;



CREATE TABLE `Users` (
	`ID` INT(20) NOT NULL AUTO_INCREMENT,
	`Password` VARCHAR(255) NOT NULL,
	PRIMARY KEY (`ID`)
)engine=InnoDB default charset=cp1251;



ALTER TABLE `Measure` ADD CONSTRAINT `Measure_fk0` FOREIGN KEY (`ID`) REFERENCES `Nomenclature`(`Name_of_measure`);

ALTER TABLE `Nomenclature` ADD CONSTRAINT `Nomenclature_fk0` FOREIGN KEY (`Name_of_measure`) REFERENCES `Requests`(`Code`);

ALTER TABLE `Nomenclature` ADD CONSTRAINT `Nomenclature_fk1` FOREIGN KEY (`Comment`) REFERENCES `Good_movement`(`ID`);

ALTER TABLE `Operations` ADD CONSTRAINT `Operations_fk0` FOREIGN KEY (`ID`) REFERENCES `Good_movement`(`Code_of_operation`);

ALTER TABLE `Suppliers` ADD CONSTRAINT `Suppliers_fk0` FOREIGN KEY (`ID`) REFERENCES `Good_movement`(`Code_of_supplier`);

ALTER TABLE `Suppliers` ADD CONSTRAINT `Suppliers_fk1` FOREIGN KEY (`Name_of_supplier`) REFERENCES `Requests`(`Code_of_supplier`);
...
Рейтинг: 0 / 0
24.11.2016, 13:18
    #39353592
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с ключами (Foreign key)
woody19rus,

и какой именно constraint возвращает ошибку?
Про минимальный воспроизводимый пример когда-нибудь слышали?
...
Рейтинг: 0 / 0
24.11.2016, 13:20
    #39353593
woody19rus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с ключами (Foreign key)
Melkijwoody19rus,

и какой именно constraint возвращает ошибку?
Про минимальный воспроизводимый пример когда-нибудь слышали?

При каждом constraint ошибку возвращает.
Про мин. воспроизводимый пример, не слышал
...
Рейтинг: 0 / 0
24.11.2016, 13:20
    #39353595
woody19rus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с ключами (Foreign key)
Melkijwoody19rus,

и какой именно constraint возвращает ошибку?
Про минимальный воспроизводимый пример когда-нибудь слышали?

Но уже прочел, исправлюсь в будущем)
...
Рейтинг: 0 / 0
24.11.2016, 13:36
    #39353610
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с ключами (Foreign key)
А Вы знаете, что референсы умеют референситься только на индексы, а никак не на поля?
Код: sql
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.
mysql> CREATE TABLE `Measure` (
    ->  `ID` INT(20) NOT NULL AUTO_INCREMENT,
    ->  `Name_of_measure` VARCHAR(255),
    ->  `Short_title` VARCHAR(255),
    ->  PRIMARY KEY (`ID`)
    -> )engine=InnoDB default charset=cp1251;
Query OK, 0 rows affected (0.34 sec)

mysql> CREATE TABLE `Nomenclature` (
    ->  `ID` INT(20) NOT NULL AUTO_INCREMENT,
    ->  `Name` VARCHAR(255),
    ->  `Article` INT(20),
    ->  `Name_of_measure` integer REFERENCES `Measure` (`ID`),
    ->  `Consignment` VARCHAR(255),
    ->  `Comment` VARCHAR(255),
    ->  PRIMARY KEY (`ID`)
    ->
    -> )engine=InnoDB default charset=cp1251;
Query OK, 0 rows affected (0.24 sec)

mysql> ALTER TABLE `Measure` ADD CONSTRAINT `Measure_fk0` FOREIGN KEY (`ID`) REFERENCES `Nomenclature`(`Name_of_measure`);
ERROR 1215 (HY000): Cannot add foreign key constraint

mysql> CREATE INDEX `Name_of_measure` ON `Nomenclature`(`Name_of_measure`);
Query OK, 0 rows affected (0.27 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE `Measure` ADD CONSTRAINT `Measure_fk0` FOREIGN KEY (`ID`) REFERENCES `Nomenclature`(`Name_of_measure`);
Query OK, 0 rows affected (0.75 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>
...
Рейтинг: 0 / 0
24.11.2016, 13:39
    #39353615
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с ключами (Foreign key)
Кстати, в таблицы при ТАКОЙ структуре ничего не вставить. В первую не даст вставить реф на вторую, и наоборот.
...
Рейтинг: 0 / 0
24.11.2016, 13:59
    #39353641
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с ключами (Foreign key)
AkinaКстати, в таблицы при ТАКОЙ структуре ничего не вставить. В первую не даст вставить реф на вторую, и наоборот.
Меня это тоже очень озадачило.
Одна проблема - это mysql. В Measure вставить запись можно будет по одной интересной причине:
Код: sql
1.
`Name_of_measure` integer REFERENCES `Measure` (`ID`),


Этого внешнего ключа на самм деле нет. http://dev.mysql.com/doc/refman/5.7/en/create-table.html
авторMySQL parses but ignores “inline REFERENCES specifications” (as defined in the SQL standard) where the references are defined as part of the column specification. MySQL accepts REFERENCES clauses only when specified as part of a separate FOREIGN KEY specification.
Такой вот интересный способ отстрелить себе ногу. Аналогично check парсятся как валидный DDL, но ничего не делают.

AkinaА Вы знаете, что референсы умеют референситься только на индексы, а никак не на поля?
Всё-таки именно на поля, но на этих полях должны быть индексы. Составной индекс с необходимым полем на первом месте тоже сгодится.

Детали ошибки при создании индекса доступны только в одном неочевидном месте. Надо смотреть в секцию LATEST FOREIGN KEY ERROR листинга запроса SHOW ENGINE INNODB STATUS.
mysqlCannot find an index in the referenced table where the referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
...
Рейтинг: 0 / 0
26.11.2016, 12:43
    #39354973
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка с ключами (Foreign key)
Выполните команды по одной и определите после какой из них появляется ошибка.

woody19rus
Код: plsql
1.
ALTER TABLE `Nomenclature` ADD CONSTRAINT `Nomenclature_fk1` FOREIGN KEY (`Comment`) REFERENCES `Good_movement`(`ID_Good_movement`);

А это зачем???
Это и не нужно, и технически невозможно. т.к. у полей Comment и ID_Good_movement разный тип.

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


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