MySQL FOREIGN KEY 约束语法

问题描述 投票:0回答:3

当我要执行此代码时,我收到此错误消息:

您的 SQL 语法有错误;检查手册 与您的 MySQL 服务器版本相对应,以便使用正确的语法 靠近“添加约束

fk_pay_grade_scale
外键
pay_scale_id
” 第 11 行引用“pay_s”

但我不明白这个问题。感谢您的帮助!

如果不存在`pay_grades`则创建表(
    `pay_grade_id` int(20) NOT NULL,
  `pay_scale_id`tinyint(4) NOT NULL,
  `name` varchar(100) NOT NULL,
  `basic_salary` 小数(10,2) NOT NULL,
  `status` int(2) NOT NULL DEFAULT '1',
   主键(`pay_grade_id`),
   INDEX (`pay_scale_id`, `pay_grade_id`),
   在删除限制的更新级联上添加约束“fk_pay_grade_scale”外键“pay_scale_id”引用“pay_scales”(“id”)
) 引擎=InnoDB 默认字符集=utf8;


如果不存在则创建表 `pay_scales` (
`id`tinyint(4) NOT NULL,
  `name` varchar(100) NOT NULL,
  主键(id)
) 引擎=InnoDB 默认字符集=utf8;
mysql foreign-keys create-table
3个回答
4
投票

您不能在

ADD CONSTRAINT
声明中使用
CREATE TABLE
。 创建表后或在
CREATE TABLE
.

中声明您的约束

第一种解决方案:在CREATE TABLE中添加约束

CREATE TABLE IF NOT EXISTS `pay_grades` (
  `pay_grade_id` int(20) NOT NULL,
  `pay_scale_id` tinyint(4) NOT NULL,
  `name` varchar(100) NOT NULL,
  `basic_salary` decimal(10,2) NOT NULL,  
  `status` int(2) NOT NULL DEFAULT '1',  
   PRIMARY KEY (`pay_grade_id`),
   INDEX (`pay_scale_id`, `pay_grade_id`),  
   FOREIGN KEY (`pay_scale_id`) REFERENCES `pay_scales`(`id`) ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

第二种解决方案:更改表以添加约束

创建没有约束的表,然后添加约束,如下所示:

ALTER TABLE `pay_grades` 
ADD CONSTRAINT `pay_scale_id` FOREIGN KEY REFERENCES `pay_scales`(`id`) 
ON UPDATE CASCADE ON DELETE RESTRICT;

MySQL 文档 用于外键声明。


0
投票

表创建顺序似乎有所不同。先创建主键表,然后创建外键表。

CREATE TABLE IF NOT EXISTS `pay_scales` (
`id` tinyint(4) NOT NULL,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE IF NOT EXISTS `pay_grades` (
    `pay_grade_id` int(20) NOT NULL,
  `pay_scale_id` tinyint(4) NOT NULL,
  `name` varchar(100) NOT NULL,
  `basic_salary` decimal(10,2) NOT NULL,  
  `status` int(2) NOT NULL DEFAULT '1',  
   PRIMARY KEY (`pay_grade_id`),
   INDEX (`pay_scale_id`, `pay_grade_id`),  
   ADD CONSTRAINT `fk_pay_grade_scale` FOREIGN KEY `pay_scale_id` REFERENCES `pay_scales`(`id`) ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

0
投票

您遇到的错误消息与创建

pay_grades
表的 SQL 语句的语法有关。您定义外键约束的方式似乎存在问题。具体来说,FOREIGN KEY 子句应位于列定义之后,而不是位于 INDEX 子句中。

以下是使用外键约束创建

pay_grades
表的更正 SQL 代码:

CREATE TABLE IF NOT EXISTS `pay_grades` (
    `pay_grade_id` int(20) NOT NULL,
    `pay_scale_id` tinyint(4) NOT NULL,
    `name` varchar(100) NOT NULL,
    `basic_salary` decimal(10,2) NOT NULL,  
    `status` int(2) NOT NULL DEFAULT '1',  
    PRIMARY KEY (`pay_grade_id`),
    FOREIGN KEY (`pay_scale_id`) REFERENCES `pay_scales`(`id`) ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在此更正的代码中,我将 FOREIGN KEY 子句移到 INDEX 子句之外,并将其放置在

pay_scale_id
的列定义之后。这应该可以解决您遇到的语法错误。

© www.soinside.com 2019 - 2024. All rights reserved.