MySQL CREATE TABLE & FOREIGN KEY Ошибка - PullRequest
3 голосов
/ 27 октября 2011

Я не парень из БД, но я немного взломал этот и, похоже, не могу решить эту проблему.Я прочитал соответствующую страницу документа (http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html) и не вижу, в чем может быть проблема с моим синтаксисом.

ERROR 1064 (42000) at line 84: 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 'FOREIGN KEY (user_id) REFERENCES user(id)
    ON DELETE RESTRICT ON UPDATE C' at line 5

Это соответствующий SQL-порядок (идентификатор) и пользователь (идентификатор)автоматически увеличивают поля int (10) в соответствующих таблицах.

DROP TABLE IF EXISTS `user_orders`;
CREATE TABLE `user_orders` (
`user_id` int(10) unsigned NOT NULL default '0',
`order_id` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`user_orders_user_id`, `user_orders_order_id`)
FOREIGN KEY (user_id) REFERENCES user(id)
    ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY (order_id) REFERENCES order(id)
    ON DELETE RESTRICT ON UPDATE CASCADE,
) AUTO_INCREMENT=50;

Помощь будет принята, особенно если вы сможете объяснить, что я пропустил.

Ответы [ 2 ]

5 голосов
/ 27 октября 2011

Вы пропустили запятую после своего PK:

PRIMARY KEY (`user_orders_user_id`, `user_orders_order_id`), -- <-------
FOREIGN KEY (user_id) REFERENCES user(id) ...

И вы захотите использовать движок InnoDB, если хотите применить внешние ключи:

) AUTO_INCREMENT=50 ENGINE=InnoDB;
0 голосов
/ 23 марта 2016

Полагаю, ты не представляешь, что делаешь.Ваш код полон ошибок.

user_id int (10) без знака NOT NULL по умолчанию '0', order_id int (10) без знака NOT NULL по умолчанию '0', ПЕРВИЧНЫЙ КЛЮЧ (user_orders_user_id, user_orders_order_id)

Откуда взялись user_orders_user_id.И почему двойной.Потратьте время, чтобы прочитать ваш код.Должно быть, ПЕРВИЧНЫЙ КЛЮЧ (user_id, order_id)

ИНОСТРАННЫЙ КЛЮЧ (user_id) ССЫЛКИ user (id) НА УДАЛИТЬ ОГРАНИЧЕНИЕ НА ОБНОВЛЕНИЕ КАСКАД, ИНОСТРАННЫЙ КЛЮЧ (order_id) ССЫЛКИ заказ (идентификатор) НА УДАЛИТЬОГРАНИЧЕНИЕ НА ОБНОВЛЕНИЕ КАСКАДА,) AUTO_INCREMENT = 50;

Я предлагаю вам использовать другой подход.Сначала измените порядок запятых, чтобы вы могли легко их поменять.Затем поместите # перед вашими линиями FK.

    DROP TABLE IF EXISTS `user_orders`;
CREATE TABLE `user_orders` 
( user_id int(10) unsigned NOT NULL default '0'
, order_id int(10) unsigned NOT NULL default '0'
, PRIMARY KEY (`user_id`, `order_id`)
#, FOREIGN KEY (user_id) REFERENCES userS(id)  ON DELETE RESTRICT ON UPDATE CASCADE
# , FOREIGN KEY (order_id) REFERENCES order_id) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB 
# AUTO_INCREMENT=50 
DEFAULT CHARSET=utf8
;

Упростить.Это работает по крайней мере.Затем раскомментируйте 1 строку за раз.

Тип

ПОКАЗАТЬ СТАТУС ДВИГАТЕЛЯ INNODB;

всякий раз, когда вы получаете странные ошибки mysql.Ищите

------------------------
LATEST FOREIGN KEY ERROR
------------------------
160323 10:25:43 Error in foreign key constraint of table DEMO/user_orders:
FOREIGN KEY (user_id) REFERENCES userS(id)  ON DELETE RESTRICT ON UPDATE CASCADE

Это приводит к следующему решению.

    CREATE TABLE `USERS` 
( `ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT
, `NAME` VARCHAR(10) NOT NULL
, `EMAIL` VARCHAR(20) NOT NULL
, `ACTIVE` BOOLEAN NOT NULL default 0
, CONSTRAINT PK PRIMARY KEY (`ID`) USING BTREE
, UNIQUE KEY `UK_ID` (`ID`) USING BTREE
, UNIQUE KEY `UK_NAME` (`NAME`)
, UNIQUE KEY `UK_EMAIL` (`EMAIL`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `user_orders`;
CREATE TABLE `user_orders` 
( user_id int(10) unsigned NOT NULL # default '0'
, order_id int(10) unsigned NOT NULL # default '0'
, PRIMARY KEY (`user_id`, `order_id`)
, FOREIGN KEY (user_id) REFERENCES USERS(id)  ON DELETE RESTRICT ON UPDATE CASCADE
# , FOREIGN KEY (order_id) REFERENCES order_id ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB 
# AUTO_INCREMENT=50 
DEFAULT CHARSET=utf8
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...