需要一个快速的外键进修课程

时间:2010-11-10 19:39:23

标签: mysql foreign-keys

我知道我在这里做了一些愚蠢的事情,但是我用外键工作了几年,我一直在做的项目我们用代码而不是数据库来做。这是我的表:

delimiter $$

CREATE TABLE `show_survey_name` (
  `idSHOW_survey_name` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL COMMENT 'the name of the survey',
  `start_date` date default NULL COMMENT 'the start date for the survey',
  `end_date` date default NULL COMMENT 'end date for the survey',
  `deleted` tinyint(1) NOT NULL default '0' COMMENT 'has the survey been deleted',
  `survey_launch_location` varchar(255) default NULL COMMENT 'where in showpro does this survey pop up.',
  `optional` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`idSHOW_survey_name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$

delimiter $$

CREATE TABLE `show_store_location` (
  `store_id` int(11) NOT NULL auto_increment,
  `clientID` int(11) default '0',
  `store_code` varchar(4) default NULL,
  `store_name` varchar(255) default NULL,
  `store_link` varchar(255) default NULL,
  `store_email` varchar(255) default NULL,
  `store_phone` varchar(50) default NULL,
  `store_fax` varchar(50) NOT NULL default '',
  `store_contact` varchar(255) default NULL,
  `region_code` varchar(5) default NULL,
  `store_update_code` varchar(50) default NULL,
  `Deleted` int(11) NOT NULL default '0',
  `unbock_term_id` varchar(45) default NULL,
  `north_dealerid` varchar(45) default NULL,
  `north_clientid` varchar(45) default NULL,
  `tide_dealerid` varchar(45) default NULL,
  `tide_msgtype` varchar(45) default NULL,
  `tide_dlrname` varchar(45) default NULL,
  `smart_dlrname` varchar(45) default NULL,
  PRIMARY KEY  (`store_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$

delimiter $$

CREATE TABLE `show_survey_name_store` (
  `idSHOW_survey_name_store` int(11) NOT NULL,
  `SHOW_survey_name_idSHOW_survey_name` int(11) NOT NULL,
  `SHOW_store_location_store_id` int(11) NOT NULL,
  PRIMARY KEY  (`idSHOW_survey_name_store`),
  KEY `fk_SHOW_survey_name_store_SHOW_survey_name1` (`SHOW_survey_name_idSHOW_survey_name`),
  KEY `fk_SHOW_survey_name_store_SHOW_store_location1` (`SHOW_store_location_store_id`),
  CONSTRAINT `fk_SHOW_survey_name_store_SHOW_store_location1` FOREIGN KEY (`SHOW_store_location_store_id`) REFERENCES `show_store_location` (`store_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_SHOW_survey_name_store_SHOW_survey_name1` FOREIGN KEY (`SHOW_survey_name_idSHOW_survey_name`) REFERENCES `show_survey_name` (`idSHOW_survey_name`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$

当我尝试在将商店与调查链接的链接表中进行简单插入时,

insert into SHOW_survey_name_store (SHOW_store_location_store_id, idSHOW_survey_name_store) values (3, 3)

我得到了

java.sql.BatchUpdateException: Cannot add or update a child row: a foreign key constraint fails (`showroom/show_survey_name_store`, CONSTRAINT `fk_SHOW_survey_name_store_SHOW_store_location1` FOREIGN KEY (`SHOW_store_location_store_id`) REFERENCES `show_store_location` (`store_id`) ON DEL)

我知道我可能做了一些简单的错误,是的,记录3存在于商店和调查表中。它应该插入,我不明白为什么不是。

谢谢你们

1 个答案:

答案 0 :(得分:1)

好的,首先,我不知道你是如何设法创建这些表的,因为你将show_store_location设置为MyISAM,这对外键不起作用。在我将其更改为InnoDB之前,MySQL没有让我创建它。我还必须更改表的创建顺序。 (我已编辑您的问题以解决这两个问题)

其次,你的实际问题不是你的外键,而是你可怕的,可怕的命名约定。我不得不查看这个五分钟,并对“show”,“store”和“id”的所有各种语言组合进行排序,以便意识到你只是在插入中使用了错误的列名(第二个)

insert into show_survey_name_store (SHOW_store_location_store_id, SHOW_survey_name_idSHOW_survey_name) values (3, 3);

所以,,清理您的列名和表名。不仅是为了你自己,也为了那些在你继续前进之后必须看到它的可怜的灵魂。

最后,我必须在插入工作之前修改show_survey_name_store

ALTER TABLE `show_survey_name_store` MODIFY COLUMN `idSHOW_survey_name_store` INTEGER NOT NULL AUTO_INCREMENT;

您可能不希望它自动递增,这没关系,但是您必须定义默认值或删除NOT NULL