MySQL FOREIGN KEY 约束语法

Posted

技术标签:

【中文标题】MySQL FOREIGN KEY 约束语法【英文标题】:MySQL FOREIGN KEY Constraints Syntax 【发布时间】:2016-11-29 17:05:56 【问题描述】:

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

您的 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)不为空, `status` int(2) NOT NULL DEFAULT '1', 主键(`pay_grade_id`), 索引(`pay_scale_id`,`pay_grade_id`), 添加约束 `fk_pay_grade_scale` 外键 `pay_scale_id` 参考 `pay_scales`(`id`) ON UPDATE CASCADE ON DELETE RESTRICT ) 引擎=InnoDB 默认字符集=utf8; 如果不存在 `pay_scales` 则创建表( `id` tinyint(4) 非空, `name` varchar(100) NOT NULL, 主键(id) ) 引擎=InnoDB 默认字符集=utf8;

【问题讨论】:

【参考方案1】:

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

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;

【讨论】:

【参考方案2】:

您不能在 CREATE TABLE 声明中使用 ADD CONSTRAINT。 在创建表后或在 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 documentation 用于外键声明。

【讨论】:

@zamansarker 接受答案意味着单击答案旁边的小勾号。如果其他答案有帮助,您也应该考虑支持它们。更多详情***.com/help/someone-answers

以上是关于MySQL FOREIGN KEY 约束语法的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 之 foreign key

postgresql----数据库表约束----FOREIGN KEY

mysql启动和关闭外键约束的方法(FOREIGN_KEY_CHECKS)

MySQL之外键约束(FOREIGN KEY)

MySQL外键约束-foreign key

MySQL外键约束-foreign key