Странная проблема внешнего ключа с MySQL 5.5.9 - PullRequest
2 голосов
/ 17 марта 2011

У меня довольно странная проблема с внешними ключами, а именно, она не работает должным образом:

ALTER TABLE contact_contactlist 
  ADD FOREIGN KEY (contact_id) REFERENCES contacts(id) ON DELETE CASCADE;

ALTER TABLE contact_contactlist 
  ADD FOREIGN KEY (contactlist_id) REFERENCES contactLists(id) ON DELETE CASCADE;

ALTER TABLE contactLists 
  ADD FOREIGN KEY (owner_id) REFERENCES serviceAccounts(id);

(автоматически генерируется Doctrine 2)

Тем не менее, это прекрасно работает:

ALTER TABLE `contact_contactlist`
  ADD CONSTRAINT `contact_contactlist_ibfk_5` 
    FOREIGN KEY (`contact_id`) REFERENCES `contacts` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `contact_contactlist_ibfk_6` 
    FOREIGN KEY (`contactlist_id`) REFERENCES `contactLists` (`id`) ON DELETE CASCADE;  
ALTER TABLE `contactLists`
  ADD CONSTRAINT `contactlists_ibfk_1` 
    FOREIGN KEY (`owner_id`) REFERENCES `serviceAccounts` (`id`);

(phpMyAdmin экспорт тех же ключей выше)

Проблема проявляется в том, что MySQL не позволит мне что-либо вставлять в таблицы, если ключи определены с помощью SQL из первого блока, жалуясь на ссылочную целостность (даже если ссылочные записи существуют), но все будет хорошо, если Я установил ключи с помощью SQL из второго блока.

Мне известно, что я могу просто "продолжать и быть счастливым", используя последнее определение ключа SQL, но я бы предпочел, чтобы я мог как-то просто придерживаться сгенерированного Doctrine SQL, так как я еще на ранней стадии разработки модель будет меняться довольно часто (таким образом, двухступенчатое ручное закрепление ключа станет довольно раздражающим).

EDIT

Вот операторы создания

CREATE TABLE contact_contactlist (
  contact_id BIGINT NOT NULL, 
  contactlist_id BIGINT NOT NULL, 
  INDEX contact_contactlist_contact_id_idx (contact_id), 
  INDEX contact_contactlist_contactlist_id_idx (contactlist_id), 
  PRIMARY KEY(contact_id, contactlist_id)) 
ENGINE = InnoDB; 

CREATE TABLE contactLists (
  id BIGINT AUTO_INCREMENT NOT NULL, 
  owner_id INT DEFAULT NULL, 
  name VARCHAR(255) NOT NULL, 
  INDEX contactLists_owner_id_idx (owner_id), 
  PRIMARY KEY(id)) 
ENGINE = InnoDB;

1 Ответ

1 голос
/ 07 июня 2011

Если вы используете Mac OS X, вы можете столкнуться с ошибкой в ​​MySQL:
Сбой ограничения внешнего ключа MySQL 5.5 при наличии внешнего ключа

...