Помимо многих других причин в результате возникает ошибка 150 MySql (при использовании InnoDB). Одной из вероятных причин является неопределенная KEY
в операторе create таблицы, содержащей имя столбца, на который ссылается внешний ключ относительная таблица.
Допустим, оператор создания главной таблицы -
CREATE TABLE 'master_table' (<br/>
'id' int(10) NOT NULL AUTO_INCREMENT,<br/>
'record_id' char(10) NOT NULL,<br/>
'name' varchar(50) NOT NULL DEFAULT '',<br/>
'address' varchar(200) NOT NULL DEFAULT '',<br/>
PRIMARY KEY ('id')<br/>
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
и синтаксис создания для таблицы относительной_таблицы, в которой ограничение внешнего ключа установлено из первичной таблицы -
CREATE TABLE 'relative_table' (<br/>
'id' int(10) NOT NULL AUTO_INCREMENT,<br/>
'salary' int(10) NOT NULL DEFAULT '',<br/>
'grade' char(2) NOT NULL DEFAULT '',<br/>
'record_id' char(10) DEFAULT NULL,<br/>
PRIMARY KEY ('id'),<br/>
CONSTRAINT 'fk_slave_master' FOREIGN KEY ('record_id') REFERENCES 'master' ('record_id')<br/>
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Этот скрипт определенно завершится с ошибкой MySql 150 при использовании InnoDB.
Чтобы решить эту проблему, нам нужно добавить KEY
для столбца record_id
в таблице master_table
и затем ссылку в таблице relative_table
, которая будет использоваться в качестве постороннего ключа.
Наконец, оператор create для master_table
будет -
CREATE TABLE 'master_table' (<br/>
'id' int(10) NOT NULL AUTO_INCREMENT,<br/>
'record_id' char(10) NOT NULL,<br/>
'name' varchar(50) NOT NULL DEFAULT '',<br/>
'address' varchar(200) NOT NULL DEFAULT '',<br/>
PRIMARY KEY ('id'),<br/>
<b>KEY 'record_id' ('record_id')</b><br/>
) ENGINE=InnoDB DEFAULT CHARSET=utf8;