在MySQL中创建外键

时间:2015-10-18 08:32:28

标签: mysql foreign-keys mysql-workbench

我尝试使用MySQL工作台在MySQL中创建外键。但是有一个错误

$ Executing:
ALTER TABLE `project_course`.`attendance` 
ADD CONSTRAINT `FK_Student`
  FOREIGN KEY ('idStudent')
  REFERENCES `project_course`.`student` ('userid')
  ON DELETE NO ACTION
  ON UPDATE NO ACTION;

Operation failed: There was an error while applying the SQL script to the database.
ERROR 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 ''idStudent')
  REFERENCES `project_course`.`student` ('userid')
  ON DELETE NO A' at line 3
SQL Statement:
ALTER TABLE `project_course`.`attendance` 
ADD CONSTRAINT `FK_Student`
  FOREIGN KEY ('idStudent')
  REFERENCES `project_course`.`student` ('userid')
  ON DELETE NO ACTION
  ON UPDATE NO ACTION

3 个答案:

答案 0 :(得分:2)

问题在于引号(在PC上它位于Enter键周围)。您已经使用它们而不是反引号(在PC上它位于Esc键下)。

ALTER TABLE `project_course`.`attendance` 
ADD CONSTRAINT `FK_Student`
  FOREIGN KEY (`idStudent`) # Change them here around `idStudent` 
  REFERENCES `project_course`.`student` (`userid`) # and here around `userid` 
  ON DELETE NO ACTION
  ON UPDATE NO ACTION;

答案 1 :(得分:0)

穆萨的回答是正确的,但这种解释留下了一些欲望。这是一个更好的。

您在外键和引用子句中使用单引号字符作为列名。单引号表示MySQL中的字符串,但是在这些位置需要列引用,即标识符。在您的情况下,您根本不需要引号,因为在不使用引号(see the identifier rules for MySQL)时,您的标识符中的所有字符都是允许的。但是,如果您根据用户输入或其他生成的数据创建查询,则始终引用是一个好主意(以避免sql注入并确保无论使用的引用名称如何都能正常工作)。

通常引用意味着将标识符放在反引号中,这总是有效的。或者,您可以使用“双引号”,但仅当您当前的SQL模式包含ANSI_QUOTES模式时。否则双引号也表示字符串(如单引号)。如果您无法确保设置ANSI_QUOTES模式,则使用双引号会有点风险。

答案 2 :(得分:0)

将此代码复制并粘贴到 Mysql脚本编辑器中并运行。您将有两个表类别产品这些表 cat_id 外键

CREATE DATABASE IF NOT EXISTS dbdemo;

USE dbdemo;

CREATE TABLE categories(
   cat_id int not null auto_increment primary key,
   cat_name varchar(255) not null,
   cat_description text
) ENGINE=InnoDB;

CREATE TABLE products(
   prd_id int not null auto_increment primary key,
   prd_name varchar(355) not null,
   prd_price decimal,
   cat_id int not null,
   FOREIGN KEY fk_cat(cat_id)
   REFERENCES categories(cat_id)
   ON UPDATE CASCADE
   ON DELETE RESTRICT
)ENGINE=InnoDB;