MySQL: проблема с конкретной ссылкой - PullRequest
0 голосов
/ 15 декабря 2010

У меня есть две таблицы. On - это таблица, которая содержит IP-диапазоны и соответствующие им страны (таблица IPGEO). Другая - это таблица, которая просто отслеживает последнюю страну, из которой был получен доступ к сайту для каждого пользователя. Идея состоит в том, что, если пользователь неожиданно получает доступ к сайту из другой страны, я уведомляю пользователя об этом по электронной почте.

Теперь для фактических таблиц. У меня есть эти два:

Таблица IPGeo, содержащая диапазоны IP-адресов

CREATE  TABLE IF NOT EXISTS `politiker_lu`.`IPGeo` (
  `IPFrom` INT(11) NOT NULL ,
  `IPTo` INT(11) NOT NULL ,
  `code2` VARCHAR(2) NOT NULL ,
  `code3` VARCHAR(3) NOT NULL ,
  `Country` VARCHAR(45) NOT NULL ,
  INDEX `index1` (`IPFrom` ASC) ,
  INDEX `index2` (`IPTo` ASC) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

Затем есть таблица user_geo, которая отслеживает последнюю страну, из которой пользователь зашел на сайт.

CREATE  TABLE IF NOT EXISTS `politiker_lu`.`user_geo` (
  `fi_user` INT(10) UNSIGNED NOT NULL ,
  `fi_country` VARCHAR(3) NOT NULL ,
  `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
  PRIMARY KEY (`fi_user`) ,
  INDEX `fk_user_geo_1` (`fi_user` ASC) ,
  CONSTRAINT `fk_user_geo_1`
    FOREIGN KEY (`fi_user` )
    REFERENCES `politiker_lu`.`user` (`id_user` )
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

Это таблицы в том виде, в котором они существуют. Теперь я хочу сослаться на эти две таблицы следующим образом:

ALTER TABLE `politiker_lu`.`user_geo` 
  ADD CONSTRAINT `fk_user_geo_IPGeo1`
  FOREIGN KEY (`fi_country` )
  REFERENCES `politiker_lu`.`IPGeo` (`code3` )
  ON DELETE CASCADE
  ON UPDATE CASCADE
, ADD INDEX `fk_user_geo_IPGeo1` (`fi_country` ASC) ;

Однако это утверждение не выполняется с ошибкой 150. Обе таблицы имеют вид utf8, оба столбца имеют одинаковый тип данных. Я что-то упускаю здесь жизненно важное?

Примечания

Таблица user существует, имеет все ссылки и на самом деле не имеет отношения к проблеме. Я оставил его, чтобы мне не нужно было слишком много редактировать заявление.

1 Ответ

1 голос
/ 15 декабря 2010

Вам необходимо добавить уникальный индекс или первичный ключ в столбец IPGeo.code3, чтобы связать его с внешним ключом.

Чтобы увидеть ошибку, выполните show engine innodb status\G и просмотрите подLATEST FOREIGN KEY ERROR раздел.Ошибка, вероятно, выглядит примерно так:

Cannot 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.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
for correct foreign key definition.
...