2014-09-16 2 views
0

У меня проблема при попытке обновить таблицу. Я пытаюсь выполнить команду следовать:Doctrine Update - Mysql Errno: 150

sudo -u www-data -H ./app/console doctrine:schema:update --dump-sql 
ALTER TABLE users ADD CONSTRAINT FK_1483A5E9A35D7AF0 FOREIGN KEY (invitation_id) REFERENCES Invitation (code); 
CREATE UNIQUE INDEX UNIQ_1483A5E9A35D7AF0 ON users (invitation_id); 

На основе этой конфигурации:

#../Entity/Users.php 

/** 
* @ORM\OneToOne(targetEntity="Invitation", inversedBy="user") 
* @ORM\JoinColumn(referencedColumnName="code") 
* @Assert\NotNull(message="Your invitation is wrong") 
*/ 
protected $invitation; 

#../Entity/Invitations.php 

/** @ORM\OneToOne(targetEntity="Users", mappedBy="invitation", cascade={"persist", "merge"}) */ 
protected $user; 

это дает мне ошибку:

[Doctrine\DBAL\DBALException] 
An exception occurred while executing 'ALTER TABLE users ADD CONSTRAINT FK_1483A5E9F11D61A2 FOREIGN KEY (invitation) REFERENCES Invitation (code)': 
SQLSTATE[HY000]: General error: 1005 Can't create table 'loopanime-mvc.#sql-402_bc3' (errno: 150) 

Обе таблицы находятся на InnoDB и коллекции ut8_unicode_ci. Я не пытался запустить, чтобы создать индекс вручную, потому что это не то, что я хочу! Но почему, черт возьми, доктрина не создает сначала IDX перед FK ??

Как я могу решить свою дилемму. Спасибо. Извините, если вопрос не ясен, я не могу описать больше этого ...

+0

Errno 150 может быть вызван различиями в типе данных, но он также может быть вызван, если в таблице нет данных, которые не удовлетворяют ограничению. Поэтому я бы предположил, что у вас есть несколько строк в «users», которые ссылаются на несуществующий код приглашения. –

+0

Я усекал обе таблицы, но до сих пор не делает этого трюка. Если я добавлю указатель вручную, а затем создаю FK, он будет работать. Я думаю, что это ошибка доктрины, доводя ее до последней. Или есть мои аннотации. –

+0

Какую версию MySQL вы используете? Создание внешнего ключа должно создать необходимый индекс неявно с MySQL 4.1.2, который является древним историческим артефактом по сегодняшним стандартам. –

ответ

2

(Извините, что я не могу написать комментарий еще) Вы проверили, что оба поля одного типа? Errno 150 обычно производится по этой ошибке ...

+0

Я боюсь, что это не правильный ответ. Как я уже сказал на другом комментарии, я урезал обе таблицы, и все же у меня есть эта проблема. На доктрине, если бы вы знали, кстати, что я поставил вещи, это создало бы меня точно таким же ключом с теми же типами и длинами. –

+1

Извините Facundo, что вы были правы. Я усекался, но моя колонка была создана с DEFAULT NULL, и она была пропущена. Исправлено спасибо :) –

1

Его исправлено, это была разница в структуре. Doctrine создали столбец с DEFAULT NULL, вероятно, потому, что он уже имеет контент внутри таблицы, и FK не может быть создан.

Удаление всей информации/установка некоторых немых значений в столбце и изменение этой проблемы ПО УМОЛЧАНИЮ решило проблему.

Благодарим за оказанную поддержку!

Смежные вопросы