Помимо формы и многие другие причины, чтобы в конечном итоге с MySql ошибка 150 (при использовании InnoDB), одной из вероятных причин является неопределенным KEY
в инструкции create таблицы, содержащей имя столбца, на которое ссылается как внешний ключ в относительной таблице.
Скажем создать заявление мастер таблицы -
CREATE TABLE 'master_table' (
'id' int(10) NOT NULL AUTO_INCREMENT,
'record_id' char(10) NOT NULL,
'name' varchar(50) NOT NULL DEFAULT '',
'address' varchar(200) NOT NULL DEFAULT '',
PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
и создать синтаксис для relative_table таблицы, где ограничение внешнего ключа устанавливается из главной таблицы -
CREATE TABLE 'relative_table' (
'id' int(10) NOT NULL AUTO_INCREMENT,
'salary' int(10) NOT NULL DEFAULT '',
'grade' char(2) NOT NULL DEFAULT '',
'record_id' char(10) DEFAULT NULL,
PRIMARY KEY ('id'),
CONSTRAINT 'fk_slave_master' FOREIGN KEY ('record_id') REFERENCES 'master' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Этот скрипт определенно закончится MySql Error 150 при использовании InnoDB.
Чтобы решить эту проблему, нам нужно добавить KEY
для Столбца record_id
в master_table
таблицы, а затем ссылаться на relative_table
таблиц, которые будут использоваться в качестве foreign_key.
Наконец, создать заявление для master_table
, будет -
CREATE TABLE 'master_table' (
'id' int(10) NOT NULL AUTO_INCREMENT,
'record_id' char(10) NOT NULL,
'name' varchar(50) NOT NULL DEFAULT '',
'address' varchar(200) NOT NULL DEFAULT '',
PRIMARY KEY ('id'),
KEY 'record_id' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Немного быстрого тестирования, создающего 'foo', как указано выше, с MyISAM и' bar' с InnoDB, предполагает, что это так - попробуйте дважды проверить тип таблицы для 'foo'. – Rob
+1 для «Обе таблицы должны быть таблицами InnoDB», спасибо большое! – sanbhat
Даже когда обе таблицы были InnoDB, у меня все еще была такая же проблема. Я исправил его, создав индекс в указанной таблице перед созданием внешнего ключа. – IROEGBU