Внешние ключи SQL
Я был создать таблицы с синтаксисом в phpmyadmin:
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS info;
CREATE TABLE users (
user_id int unsigned NOT NULL auto_increment,
email varchar(100) NOT NULL default '',
pwd varchar(32) NOT NULL default '',
isAdmin int(1) unsigned NOT NULL,
PRIMARY KEY (user_id)
) TYPE=INNODB;
CREATE TABLE info (
info_id int unsigned NOT NULL auto_increment,
first_name varchar(100) NOT NULL default '',
last_name varchar(100) NOT NULL default '',
address varchar(300) NOT NULL default '',
zipcode varchar(100) NOT NULL default '',
personal_phone varchar(100) NOT NULL default '',
mobilephone varchar(100) NOT NULL default '',
faxe varchar(100) NOT NULL default '',
email2 varchar(100) NOT NULL default '',
country varchar(100) NOT NULL default '',
sex varchar(1) NOT NULL default '',
birth varchar(1) NOT NULL default '',
email varchar(100) NOT NULL default '',
PRIMARY KEY (info_id),
FOREIGN KEY (email) REFERENCES users(email) ON UPDATE CASCADE ON DELETE CASCADE
) TYPE=INNODB;
Но показывает ошибку:
"# 1064 - у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса для использования рядом с 'TYPE=INNODB' в строке 11 "
Если я удаляю TYPE = INNODB в конце создания таблиц, он покажет ошибку:
Msgstr "#1005 - Невозможно создать таблицу curriculo.info (номер ошибки: 150) ".
2 ответа
Использование ENGINE = INNODB
не TYPE = InnoDB
,
Из документов MySQL, версия 5.1, CREATE TABLE
синтаксис:
Заметка
Старший
TYPE
вариант был синонимомENGINE
,TYPE
устарела с MySQL 4.0, но все еще поддерживается для обратной совместимости в MySQL 5.1 (за исключением MySQL 5.1.7). Начиная с MySQL 5.1.8, он выдает предупреждение. Это удалено в MySQL 5.5. Вы не должны использоватьTYPE
в любых новых приложениях, и вы должны немедленно начать преобразование существующих приложений для использования ENGINE. (См. Раздел D.1.64, "Изменения в MySQL 5.1.8 (не выпущено)".)
Если вы хотите иметь этот внешний ключ:
FOREIGN KEY (email) REFERENCES users(email)
users(email)
должен иметь UNIQUE
ограничение. Все внешние ключи должны ссылаться на первичный или уникальный ключ. Вы хотите строку в info
Таблица для ссылки (через FK) один и только один пользователь (строка в таблице пользователей).
Тем не менее, лучшая практика (по разным причинам) состоит в том, чтобы в качестве внешних ключей использовались узкие (маленькие) столбцы с постоянной шириной. Ваш email
100 символов, которые могут быть от 100 до 300 байт (в зависимости от кодировки). Итак, вы можете рассмотреть возможность использования user_id
как FK, который имеет ширину всего 4 байта:
CREATE TABLE info (
...
---- email varchar(100) NOT NULL default '',
---- removed
user_id int unsigned NOT NULL,
PRIMARY KEY (info_id),
FOREIGN KEY (user_id) REFERENCES users(user_id)
ON UPDATE CASCADE ON DELETE CASCADE
) TYPE=INNODB;
Попробуйте "Engine=INNODB" в конце создания. (не ТИП)
Если у вас его нет, он может не работать, так как зависит от типа вашего движка по умолчанию в настройках mysql... MyIsam (самый распространенный движок по умолчанию) не поддерживает внешние ключи.