首页 文章

MySQL FOREIGN KEY约束语法

提问于
浏览
0

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

您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以便在第11行的'ADD CONSTRAINT fk_pay_grade_scale FOREIGN KEY pay_scale_id参考`pay_s'附近使用正确的语法

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

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;


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;

2 回答

  • 3

    它似乎是表创建顺序的差异 . 首先创建主键表而不是创建外键表 .

    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

    您不能在 CREATE TABLE 声明中使用 ADD CONSTRAINT . 在创建表之后或在 CREATE TABLE 中声明您的约束 .


    First solution: Add the constraint in 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;
    

    Second solution: Alter table to add the constraint

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

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

    MySQL documentation用于外键声明 .

相关问题