无法添加外键约束

时间:2014-10-15 08:56:33

标签: mysql sql foreign-keys

我无法弄清楚这里有什么问题。!!我有很多桌子 print, lamn, sec_lam, thi_lam, rewind, slit, ink以及所有这些与job_code列相关的表,我试图从order_basic添加这些表中的每一个外键,但mysql给我Cannot add foreign key constraint错误。 还请建议我在每张表上应该索引哪一列。这是我的桌子结构..

CREATE TABLE IF NOT EXISTS `dispatch` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date` varchar(255) NOT NULL,
  `job_code` int(11) NOT NULL,
  `dispatch_qty` decimal(11,2) NOT NULL,
  `no_bags` int(11) NOT NULL,
  `no_pan` int(11)  NOT NULL,
  `no_roll` int(11) NOT NULL,
  `ch_no` int(11) DEFAULT NULL,
  `remarks` text NOT NULL,
  `prepaired` varchar(255) NOT NULL,
  PRIMARY KEY (`id`,`job_code`),
  FOREIGN KEY (`job_code`) REFERENCES order_basic(`job_code`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

这是我喜欢这个表的外键的其他表

CREATE TABLE IF NOT EXISTS `order_basic` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cd_date` varchar(25) DEFAULT NULL,
  `po_num` varchar(11) DEFAULT NULL,
  `po_date` varchar(11) DEFAULT NULL,
  `del_date` varchar(11) DEFAULT NULL,
  `job_code` int(11) NOT NULL,
  `job_name` varchar(255) NOT NULL,
  `customer_name` varchar(255) DEFAULT NULL,
  `quantity` int(11) DEFAULT NULL,
  `print_type` varchar(255) NOT NULL,
  `remarks` text,
  `prepaired` varchar(255) NOT NULL,
  PRIMARY KEY (`id`,'job_code')
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;

1 个答案:

答案 0 :(得分:0)

问题是您在order_basic上有一个复合主键:

PRIMARY KEY (`id`,'job_code')`

但您的外键仅引用job_code

FOREIGN KEY (`job_code`) REFERENCES order_basic(`job_code`)

由于job_code中的order_basic不限于唯一,因此您无法在外键中引用它,因为相同的代码可能会引用order_basic中的多条记录。

e.g。在order_basic中你可以有:

id | job_code
---+---------
 1 |     1
 2 |     1
 3 |     1
 4 |     1

如果dispatch中的job_code为1,那么该记录应该引用?

如果job_code中的order_basic是唯一的,那么您可以将其设为主键,或者在此列上添加唯一约束,以允许您使用外键引用它。 如果它不是唯一的,那么您不应该在调度中存储job_code,而是存储来自id的相应order_basic并将其作为外键。如果您需要获取特定调度记录的job_code,则可以使用order_basic.id列加入。