MySQL Не могу создать таблицу (errno: 150) - PullRequest
0 голосов
/ 22 декабря 2011

У меня есть следующие две таблицы:

CREATE TABLE `table1` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `CODE` varchar(30) COLLATE utf8_bin NOT NULL,
  `LANG` varbinary(30) NOT NULL,
  `NAME` varchar(255) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `NewIndex1` (`CODE`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

и

CREATE TABLE `table2` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `TABLE1_CODE` varchar(30) NOT NULL,
  `SOME_ADD` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8

и я пытаюсь сделать ссылку на:

alter table `factorydb`.`table2` add constraint `FK_table2` FOREIGN KEY (`TABLE1_CODE`) REFERENCES `table1` (`CODE`)

Я получаю ошибку:

Can't create table 'factorydb.#sql-70c_306' (errno: 150)

Идея состоит в том, чтобы иметь дело с языковыми записями в моих таблицах, чтобы у меня были некоторые значения в table1 как

ID | CODE   | LANG | NAME
1   CARCODE    EN    Car
2   CARCODE    DE    Auto

И я хочу сделать ссылку на КОД в table1 , поскольку для меня оба значения CARCODE действительны, только в зависимости от языковых настроек.

Я делаю это неправильно?

Вся помощь приветствуется.

Ответы [ 3 ]

1 голос
/ 22 декабря 2011

Проблема заключается в том, что два связанных столбца имеют разный тип:

Table1
---------  
`CODE` varchar(30) COLLATE utf8_bin NOT NULL,

Table2
---------
`SOME_ADD` varchar(30) DEFAULT NULL, 
//This column does not have the utf8_bin collation !

Вы должны убедиться, что определение точно такое же.

1 голос
/ 22 декабря 2011

Оба столбца во внешнем ключе должны иметь одинаковый тип, длину и параметры сортировки.

Кстати, вы действительно хотите предпочесть установку внешнего ключа для целых чисел, а не varchars, это намного быстрее объединяет и занимает меньше места

0 голосов
/ 22 декабря 2011

Измените свой столбец FK как

TABLE1_CODE varchar(30) COLLATE utf8_bin NOT NULL 
...