MySQL外键约束消失 [英] MySQL foreign key constraint disappearing

查看:169
本文介绍了MySQL外键约束消失的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的表:

  / * oefenreeks leerplan * / 
CREATE TABLE leerplan_oefenreeks(
leerplan_oefenreeks_id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
leerplan_id INT NOT NULL,
oefenreeks_id INT NOT NULL,
plaats INT NOT NULL
);

/ * fk * /
ALTER TABLE leerplan_oefenreeks ADD CONSTRAINT fk_leerp_oefenr_leerplan
FOREIGN KEY(leerplan_id)参考文献leerplan(leerplan_id)ON DELETE CASCADE;

ALTER TABLE leerplan_oefenreeks ADD CONSTRAINT fk_leerp_oefenr_oefenreeks
FOREIGN KEY(oefenreeks_id)参考文献oefenreeks(oefenreeks_id)ON DELETE CASCADE;

/ *当我执行nexline时,我的fk_leerp_oefenr_leerplan约束消失/消失* /
ALTER TABLE leerplan_oefenreeks ADD CONSTRAINT un_leerp_oefenr UNIQUE(leerplan_id,oefenreeks_id);

ALTER TABLE leerplan_oefenreeks ADD CONSTRAINT un_leerp_oefenr_plaats UNIQUE(leerplan_id,plaats);

当我去检查只有3个约束存在。 fk_leerp_oefenr_leerplan 消失。我不明白为什么会发生这种情况。

解决方案

约束已经到位:

  CREATE TABLE`leerplan_oefenreeks`(
`leerplan_oefenreeks_id` int AUTO_INCREMENT,
`leerplan_id` int(11)NOT NULL,
`oefenreeks_id` int(11)NOT NULL,
`plaats` int(11)NOT NULL,
(`leerplan_oefenreeks_id`),
KEY`fk_leerp_oefenr_leerplan`(`leerplan_id`),
KEY`fk_leerp_oefenr_oefenreeks`(`oefenreeks_id`),
CONSTRAINT`fk_leerp_oefenr_oefenreeks` FOREIGN KEY(`oefenreeks_id`) `oefenreeks`(`oefenreeks_id`)ON DELETE CASCADE,
CONSTRAINT`fk_leerp_oefenr_leerplan` FOREIGN KEY(`leerplan_id`)REFERENCES`leerplan`(`leerplan_id`)ON DELETE CASCADE
)ENGINE = InnoDB DEFAULT CHARSET = latin1;请注意,fk_leerp_oefenr_leerplan和fk_leerp_oefenr_oefenreeks索引会自动添加。







< b

添加第一个唯一键约束之后:

  ALTER TABLE leerplan_oefenreeks ADD CONSTRAINT un_leerp_oefenr UNIQUE(leerplan_id,oefenreeks_id); 

Mysql删除fk_leerp_oefenr_leerplan索引,因为它不再需要支持对leerplan_id列的外键检查。此时,表格如下:

  CREATE TABLE`leerplan_oefenreeks`(
`leerplan_oefenreeks_id` int )NOT NULL AUTO_INCREMENT,
`leerplan_id` int(11)NOT NULL,
`oefenreeks_id` int(11)NOT NULL,
`plaats` int b PRIMARY KEY(`leerplan_oefenreeks_id`),
UNIQUE KEY`un_leerp_oefenr`(`leerplan_id`,`oefenreeks_id`),
KEY`fk_leerp_oefenr_oefenreeks`(`oefenreeks_id`),
CONSTRAINT`fk_leerp_oefenr_leerplan` FOREIGN KEY(`leerplan_id`)参考文献leerplan(leerplan_id)ON DELETE CASCADE,
CONSTRAINT`fk_leerp_oefenr_oefenreeks` FOREIGN KEY(`oefenreeks_id`)REFERENCES`oefenreeks`(`oefenreeks_id`)ON DELETE CASCADE
)ENGINE = InnoDB DEFAULT CHARSET = latin1;

长话短说,Sqlyog只在左边的树状视图中显示索引,如果你想请参阅外键,在树视图中选择表,然后按F10。


This is my table:

/* oefenreeks leerplan */
CREATE TABLE leerplan_oefenreeks ( 
    leerplan_oefenreeks_id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    leerplan_id            INT NOT NULL, 
    oefenreeks_id          INT NOT NULL, 
    plaats                 INT NOT NULL 
);

/* fk */
ALTER TABLE leerplan_oefenreeks ADD CONSTRAINT fk_leerp_oefenr_leerplan
FOREIGN KEY(leerplan_id) REFERENCES leerplan (leerplan_id) ON DELETE CASCADE; 

ALTER TABLE leerplan_oefenreeks ADD CONSTRAINT fk_leerp_oefenr_oefenreeks 
FOREIGN KEY(oefenreeks_id) REFERENCES oefenreeks (oefenreeks_id) ON DELETE CASCADE; 

/* when I execute the nexline, my fk_leerp_oefenr_leerplan constraint vanishes/disappears*/
ALTER TABLE leerplan_oefenreeks ADD CONSTRAINT un_leerp_oefenr UNIQUE(leerplan_id, oefenreeks_id);

ALTER TABLE leerplan_oefenreeks ADD CONSTRAINT un_leerp_oefenr_plaats UNIQUE(leerplan_id, plaats); 

When I go and check only 3 constraints exist. fk_leerp_oefenr_leerplan disappears. I don't understand why this happens.

解决方案

Just to clarify things, this is how the table looks like after the foreign key constraints have been put in place:

CREATE TABLE `leerplan_oefenreeks` (
  `leerplan_oefenreeks_id` int(11) NOT NULL AUTO_INCREMENT,
  `leerplan_id` int(11) NOT NULL,
  `oefenreeks_id` int(11) NOT NULL,
  `plaats` int(11) NOT NULL,
  PRIMARY KEY (`leerplan_oefenreeks_id`),
  KEY `fk_leerp_oefenr_leerplan` (`leerplan_id`),
  KEY `fk_leerp_oefenr_oefenreeks` (`oefenreeks_id`),
  CONSTRAINT `fk_leerp_oefenr_oefenreeks` FOREIGN KEY (`oefenreeks_id`) REFERENCES `oefenreeks` (`oefenreeks_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_leerp_oefenr_leerplan` FOREIGN KEY (`leerplan_id`) REFERENCES `leerplan` (`leerplan_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;

Notice the fk_leerp_oefenr_leerplan and fk_leerp_oefenr_oefenreeks indexes mysql adds automatically.

After you add the first unique key constraint :

ALTER TABLE leerplan_oefenreeks ADD CONSTRAINT un_leerp_oefenr UNIQUE(leerplan_id, oefenreeks_id);

Mysql removes the fk_leerp_oefenr_leerplan index as it is no longer needed to support the foreign key checks on leerplan_id column. At this point, the table looks like this:

CREATE TABLE `leerplan_oefenreeks` (
  `leerplan_oefenreeks_id` int(11) NOT NULL AUTO_INCREMENT,
  `leerplan_id` int(11) NOT NULL,
  `oefenreeks_id` int(11) NOT NULL,
  `plaats` int(11) NOT NULL,
  PRIMARY KEY (`leerplan_oefenreeks_id`),
  UNIQUE KEY `un_leerp_oefenr` (`leerplan_id`,`oefenreeks_id`),
  KEY `fk_leerp_oefenr_oefenreeks` (`oefenreeks_id`),
  CONSTRAINT `fk_leerp_oefenr_leerplan` FOREIGN KEY (`leerplan_id`) REFERENCES `leerplan` (`leerplan_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_leerp_oefenr_oefenreeks` FOREIGN KEY (`oefenreeks_id`) REFERENCES `oefenreeks` (`oefenreeks_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;

Long story short, Sqlyog only shows the indexes in it's tree view at the left, if you want to see the foreign keys, select the table in the tree view and press F10.

这篇关于MySQL外键约束消失的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆