原因

当将复合主键作为外键添加约束时写法有误导致。

解决办法

示例格式如下。

  1. CONSTRAINT `xxx_fk` FOREIGN KEY (`key1`, `key2`, ...) REFERENCES <table_name> (`fk_key1`, `fk_key2`, ...)

具体参见以下SQL文件(部分)。

  1. # 电脑组装方案
  2. DROP TABLE IF EXISTS `pc_assembly_scheme`;
  3. CREATE TABLE `pc_assembly_scheme`
  4. (
  5. `scheme_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '序号',
  6. `gpu_manufacturer` varchar(20) DEFAULT NULL COMMENT '独立显卡厂商',
  7. `gpu_model` varchar(20) DEFAULT NULL COMMENT '独立显卡型号',
  8. `mainboard_manufacturer` varchar(20) DEFAULT NULL COMMENT '主板厂商',
  9. `mainboard_model` varchar(20) DEFAULT NULL COMMENT '主板型号',
  10. `cpu_manufacturer` varchar(20) DEFAULT NULL COMMENT 'CPU厂商',
  11. `cpu_model` varchar(20) DEFAULT NULL COMMENT 'CPU型号',
  12. PRIMARY KEY (`scheme_id`) USING BTREE,
  13. UNIQUE INDEX `pc_assembly_scheme_pk` (`scheme_id`) USING BTREE,
  14. CONSTRAINT `gpu_manufacturer_fk` FOREIGN KEY (`gpu_manufacturer`, `gpu_model`) REFERENCES `gpu` (`manufacturer`, `model`) ON DELETE CASCADE ON UPDATE CASCADE,
  15. CONSTRAINT `mainboard_manufacturer_fk` FOREIGN KEY (`mainboard_manufacturer`, `mainboard_model`) REFERENCES `mainboard` (`manufacturer`, `model`) ON DELETE CASCADE ON UPDATE CASCADE,
  16. CONSTRAINT `cpu_manufacturer_fk` FOREIGN KEY (`cpu_manufacturer`, `cpu_model`) REFERENCES `cpu` (`manufacturer`, `model`) ON DELETE CASCADE ON UPDATE CASCADE
  17. ) ENGINE = InnoDB;
  18. # GPU
  19. DROP TABLE IF EXISTS `gpu`;
  20. CREATE TABLE `gpu`
  21. (
  22. `manufacturer` varchar(20) NOT NULL COMMENT '厂商',
  23. `model` varchar(20) NOT NULL COMMENT '型号',
  24. `product_series` varchar(20) DEFAULT NULL COMMENT '产品系列',
  25. `core_code` varchar(20) DEFAULT NULL COMMENT '核心代号',
  26. `manufacture_process(nm)` varchar(20) DEFAULT NULL COMMENT '制造工艺(nm)',
  27. `stream_processor_num` varchar(20) DEFAULT NULL COMMENT '流处理器数',
  28. `core_frequency(GHz)` varchar(20) DEFAULT NULL COMMENT '核心频率(GHz)',
  29. `accelerating_frequency(GHz)` varchar(20) DEFAULT NULL COMMENT '加速频率(GHz)',
  30. `video_memory_bit_width(-bit)` varchar(20) DEFAULT NULL COMMENT '显存位宽',
  31. `video_memory_capacity` varchar(20) DEFAULT NULL COMMENT '显存容量',
  32. `video_memory_frequency(GHz)` varchar(20) DEFAULT NULL COMMENT '显存频率(GHz)',
  33. `power(W)` varchar(20) DEFAULT NULL COMMENT '功耗(W)',
  34. PRIMARY KEY (`manufacturer`, `model`) USING BTREE,
  35. UNIQUE INDEX `gpu_pk` (`manufacturer`, `model`) USING BTREE
  36. ) ENGINE = InnoDB;