2017-07-15 68 views
0

我正在尝试创建校园结构。所以建筑物有地板,地板有房间。我正在尝试创建一个关系数据库,使多个房间与一个楼层和多个楼层与其建筑物相关。SQL中的一对多关系 - 外键错误

这里是我的建筑物和地板的表结构:

CREATE TABLE `building` (
`id` int(11) NOT NULL, 
`name` varchar(128) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

CREATE TABLE `floor` (
`id` int(11) NOT NULL, 
`building_id` int(11) DEFAULT NULL, 
`level` int(11) DEFAULT NULL, 
PRIMARY KEY (`id`), 
KEY `floor_building_id__fk` (`building_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

我想在与同一building_id地板表中插入多个楼层使用:

INSERT INTO `floor` SET id=3, `number` = 420, building_id=(SELECT id FROM building WHERE id=2); 

不过我不断收到以下错误:

Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`seatspace`.`floor`, CONSTRAINT `building_id` FOREIGN KEY (`id`) REFERENCES `building` (`id`)) 

我想插入,更新并删除与其指定的building_id相关的楼层。任何帮助,将不胜感激。

+0

阅读错误信息。您的FK表示floor * id *是建筑物ID;它应该说building_id是。请阅读并在[mcve]上采取行动,缺乏一个意味着这个问题是无关紧要的。比如你应该给FK DDL。例如,给定的查询似乎不是产生错误的那个 - 没有数字。 PS您已经拥有建筑物ID,您不需要在此选择子选项。我想这个子选择最终会提到多个建筑物。但要更新不能使用=的多个建筑物,除了其他更改外,还需要IN。阅读关于更新和插入。 – philipxy

回答

0

我已经通过更改外键约束名称来解决问题。我还重写了模式的一部分,以便提供所有期望的列。这是最后的模式和CRUD。

CREATE TABLE `floor` (
    `floor_id` int(11) NOT NULL AUTO_INCREMENT, 
    `number` int(11) NOT NULL, 
    `building_id` int(11) NOT NULL, 
    PRIMARY KEY (`floor_id`), 
    UNIQUE KEY `floor_id_UNIQUE` (`floor_id`), 
    KEY `building_id_idx` (`building_id`), 
    CONSTRAINT `building_id` FOREIGN KEY (`building_id`) REFERENCES `building` 
(`building_id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 

INSERT INTO `floor` (floor_id, `number`, building_id) VALUES (default, 3, 
(SELECT building_id FROM building WHERE building_id=2)) ; 
UPDATE `floor` SET `number`=3, building_id=1 WHERE floor_id=2; 
DELETE FROM `floor` WHERE floor_id=3; 

CREATE TABLE `building` (
    `building_id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(45) NOT NULL, 
    PRIMARY KEY (`building_id`), 
    UNIQUE KEY `building_id_UNIQUE` (`building_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 

INSERT INTO building (building_id, name) VALUES (DEFAULT, '1 West'); 
UPDATE `building` SET `name`='3 West' WHERE building_id=2; 
DELETE FROM `building` WHERE building_id=2;