2016-08-03 3 views
3

Я пробовал все, что мог, но у меня все еще возникают проблемы с созданием таблицы.mySQL: Что мешает моему внешнему ключу?

У меня есть таблица пользователей с первичным ключом username

+---------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+-------------+------+-----+---------+-------+ | created_at | datetime | YES | | NULL | | | updated_at | datetime | YES | | NULL | | | username | varchar(50) | NO | PRI | NULL | | | administrator | tinyint(1) | YES | | NULL | | | fullname | text | YES | | NULL | | | description | text | YES | | NULL | | | password | varchar(60) | NO | | NULL | | +---------------+-------------+------+-----+---------+-------+

, и я хочу, чтобы создать новую таблицу, как это:

CREATE TABLE sessions ( created_at DATETIME, updated_at DATETIME, token VARCHAR(50) NOT NULL, username VARCHAR(50), PRIMARY KEY (token), FOREIGN KEY(username) REFERENCES users (username) );

, но я получаю неприятную ошибку:

ERROR 1215 (HY000): Cannot add foreign key constraint

Обычно эта ошибка вызвана несоответствием в типе данных пары pk/fk, но на этот раз оба явно varchar(50), поэтому проблема в другом месте.

Я также попытался это на всякий случай:

CREATE TABLE sessions ( created_at DATETIME, updated_at DATETIME, token VARCHAR(50) NOT NULL, username varchar(50) NOT NULL, #<- ***added not null*** PRIMARY KEY (token), FOREIGN KEY(username) REFERENCES users (username) );

mysql>SHOW ENGINE INNODB STATUS

LATEST FOREIGN KEY ERROR

2016-08-03 15:13:23 a46fcb70 Error in foreign key constraint of table savesdev/sessions: FOREIGN KEY(username) REFERENCES users (username)): 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.6/en/innodb-foreign-key-constraints.html for correct foreign key definition.

Похоже, ошибка возникает при двух обстоятельствах:

1) Когда есть несоответствие (которое я исключил)

column types in the table and the referenced table do not match for constraint.

2) Если нет подходящего индекса на колонке ссылается

Cannot find an index in the referenced table where the referenced columns appear as the first columns

Я думаю, что оба они покрыты так, что сделка?

Может ли кто-нибудь указать мою ошибку?

+0

'show engine innodb status'. около 1/2 через дамп будет «последней ошибкой внешнего ключа», с деталями. Скорее всего, у вас есть несоответствие определения поля. Отношение FK должно быть идентичным, например. 'varchar (49) -> varchar (50)' не разрешен, но 'varchar (50) -> varchar (50)' is. или вы на более старом mysql, который не создает автоматическое создание индексов в полях FK, и вы вручную не добавили ключ на имя пользователя. –

+0

Возможно, у вашего имени столбца есть разные кодировки, вы можете попробовать следующее: ALTER TABLE session MODIFY username VARCHAR (50) CHARACTER SET utf8; Пользователи ALTER TABLE ИЗМЕНИТЬ имя пользователя VARCHAR (50) CHARACTER SET utf8; –

+0

Это хороший момент @elkorchianas, я посмотрю .. –

ответ

3

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

ALTER TABLE sessions MODIFY username VARCHAR(50) CHARACTER SET utf8; 
ALTER TABLE users MODIFY username VARCHAR(50) CHARACTER SET utf8; 

Как полагает @Graeme Стюарт здесь ссылку, чтобы посмотреть, как мы можем проверить фрахтователем набор базы данных/таблицы или столбца : How do I see what character set a MySQL database/table/column is?

+1

Да , поля были и VARCHAR (50), но существующая таблица имела совпадение utf8_general_ci, что сделало их несовместимыми.Моим фактическим решением было создать новую таблицу с помощью сортировки utf8_general_ci для столбца внешнего ключа. –

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