При попытке связать две колонки одной таблицы к колонке другой выдается ERROR 1215: Cannot add foreign key constraint

230
15 декабря 2017, 00:52

Делаю список друзей для своей небольшой соцсети. Для этого решил сделать связь многие ко многим, но у меня не получилось. В Mysql WorkBench, когда создаешь такую связь, он не ругается. А когда вношу изменения, всплывает ошибка 1215.

Таблица юзеров:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nickname` varchar(45) NOT NULL,
  `pass_hash` varchar(80) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `nickname_UNIQUE` (`nickname`)
) ENGINE=MyISAM AUTO_INCREMENT=1003 DEFAULT CHARSET=utf8;

Создание таблицы друзей:

Executing:
CREATE TABLE `social`.`new_table` (
  `id1` INT(11) NOT NULL,
  `id2` INT(11) NOT NULL,
  INDEX `foreign1_idx` (`id1` ASC, `id2` ASC),
  CONSTRAINT `foreign1`
    FOREIGN KEY (`id1` , `id2`)
    REFERENCES `social`.`users` (`id` , `id`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION)
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8;
ERROR 1215: Cannot add foreign key constraint
SQL Statement:
  CREATE TABLE `social`.`new_table` (
  `id1` INT(11) NOT NULL,
  `id2` INT(11) NOT NULL,
  INDEX `foreign1_idx` (`id1` ASC, `id2` ASC),
  CONSTRAINT `foreign1`
    FOREIGN KEY (`id1` , `id2`)
    REFERENCES `social`.`users` (`id` , `id`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION)
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8    
Operation failed: There was an error while applying the SQL script to the database.

Что я делаю не так? Можете предлагать свои варианты реализации, если через этот никак.

Answer 1

Вопрос закрыт. Вместо 1-го foreign key, который соединяет user.id с friendlist.id1 и friendlist.id2, нужно было создать 2 разных foreign key:

  CREATE TABLE `friendlist` (
    `id1` int(11) NOT NULL,
    `id2` int(11) NOT NULL,
    KEY `foreign1_idx` (`id1`),
    KEY `foreign_name2_idx` (`id2`),
    CONSTRAINT `foreign1` FOREIGN KEY (`id1`) REFERENCES `users` (`id`) ON 
    DELETE CASCADE ON UPDATE NO ACTION,
    CONSTRAINT `foreign2` FOREIGN KEY (`id2`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Спасибо пользователю Sergey Moiseenko за ответ.

READ ALSO
Размер типов long и int при сравнении строк

Размер типов long и int при сравнении строк

Смотрю на код сравнения строк равной длины, а именно на место, где происходит непосредственно сравнение значений по указателю

270
Несколько телефонных номеров в ASPxGridView

Несколько телефонных номеров в ASPxGridView

Есть страница добавления человека в базу данных (фио, адрес и тд), также есть 4 типа телефонных номеров (рабочий, городской и др

239
ASP.NET Core. Защита jwt токенов

ASP.NET Core. Защита jwt токенов

Я использую в своем проекте jwt токеныКод для создания ClaimsIdentity:

365
Вызов функции из dll написанной на Delphi из C#

Вызов функции из dll написанной на Delphi из C#

Есть DLL написанная на DelphiИсходников от нее у меня нет

279