2012-04-11 4 views
1

я создавать таблицы с синтаксисом в PHPMyAdmin:SQL внешние ключи

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 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TYPE=INNODB' at line 11 "

Если удалить TYPE = InnoDB в конце создания таблиц, он покажет ошибку:

"#1005 - Can't create table 'curriculo.info' (errno: 150) ".

ответ

1

Использование ENGINE = INNODB, а не TYPE = InnoDB.

С MySQL документации, версия 5.1, CREATE TABLE syntax:

Note

The older TYPE option was synonymous with ENGINE . TYPEhas been deprecated since MySQL 4.0 but is still supported for backward compatibility in MySQL 5.1 (excepting MySQL 5.1.7). Since MySQL 5.1.8, it produces a warning. It is removed in MySQL 5.5. You should not use TYPE in any new applications, and you should immediately begin conversion of existing applications to use ENGINE instead. (See Section D.1.64, “Changes in MySQL 5.1.8 (Not released)”.)


Если вы хотите, чтобы этот внешний ключ:

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; 
+0

Если бы я не сделал укажите ошибку, которую он берет по умолчанию, но ошибка «# 1005 - Не удается создать таблицу curriculo.info (errno: 150)». –

+0

Возможно, потому что у вас нет 'UNIQUE KEY (email)' ' в таблице 'users'. –

+0

Да, это было так! спасибо –

2

Попробуйте «Двигатель = INNODB» в конце создания. (не TYPE)

Если у вас его нет, это может не сработать, поскольку оно зависит от вашего типа двигателя по умолчанию в настройках mysql ... MyIsam (самый распространенный механизм по умолчанию) не поддерживает внешние ключи.

+0

я выполнить команду «статус шоу таблицы;» и было показано, что тип INNODB. –

+0

try: show create table , и это может дать вам дополнительную информацию. Не уверен, почему mysql запутывает Type и Engine в этом случае .. но если вы посмотрите: http://dev.mysql.com/doc/refman/5.1/en/create-table.html, вы увидите ключевое слово Engine , –

+0

показывает «ДВИГАТЕЛЬ = InnoDB DEFAULT CHARSET = latin1», но продолжайте с ошибкой «» # 1005 - Невозможно создать таблицу «curriculo.info» (errno: 150) «Ведьма, я думаю, ее внешняя ошибка, –

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