我尝试使用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
答案 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;