我知道我在这里做了一些愚蠢的事情,但是我用外键工作了几年,我一直在做的项目我们用代码而不是数据库来做。这是我的表:
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存在于商店和调查表中。它应该插入,我不明白为什么不是。
谢谢你们
答案 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
。