我有一个子表,它依赖于两个不相关的父表我想在子表中插入行

brgchamk  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(576)

我正在建立一个销售房屋的数据库。
我正在调用一个父表 location 有三列:
locationlat:物业所在的纬度
locationlong:属性的经度
locationname:我可以使用的另一个名称,通过名称来标识属性的位置
两者 locationLat 以及 locationlong 组成此表的复合主键。
然后我有一个叫做 houseToLet ,此表仅存储出租房屋。我有相似的不同的table houseToBuy , fullyFurnished , landtoSell 等等,这张table houseTolet 具有类似于上面位置表的复合主键,即 locationLat , locationLong 和一个外键 location_locationLat 以及 location_locationLong 引用位置表的。
我还有一张table叫 generalFeatures . 这张表是我存储所有我正在出售的房产的一般特征的地方。所以呢 generalFeatures table 是的子表 houseTolet 以及 Housetobuy 以及 Fullyfurnished table,
当我将行插入 location 表,我发现没有问题,因为它是父表。当我将行插入 houseTolet 表我没有发现问题,因为它是一个子表,我已经插入了父位置表。但是当我插入 generalFeatures 表我遇到了问题,因为它是的子表 housetoBuy 以及其他表格,包括 Fullyfurnished .
请帮助我知道我怎么能做到这一点。

CREATE TABLE IF NOT EXISTS `foreign`.`location` (
  `locationLat` DECIMAL(10,8) NOT NULL,
  `locationLong` DECIMAL(11,8) NOT NULL,
  `locationName` VARCHAR(35) NOT NULL,
  PRIMARY KEY (`locationLat`, `locationLong`))
ENGINE = InnoDB

CREATE TABLE IF NOT EXISTS `location`.`housetolet` (
  `locationLat` DECIMAL(10,8) NOT NULL,
  `locationLong` DECIMAL(11,8) NOT NULL,
  `type` ENUM('gatedCommunity', 'standalone', 'apartment') NOT NULL,
  `location_locationLat` DECIMAL(10,8) NOT NULL,
  `location_locationLong` DECIMAL(11,8) NOT NULL,
  PRIMARY KEY (`locationLat`, `locationLong`),
  INDEX `fk_housetolet_location_idx` (`location_locationLat` ASC, `location_locationLong` ASC))

CREATE TABLE IF NOT EXISTS `foreign`.`generalfeatures` (
  `locationLat` DECIMAL(10,8) NOT NULL,
  `locationLong` DECIMAL(11,8) NOT NULL,
  `livingAreaAndSize` INT NOT NULL,
  `bedrooms` TINYINT(4) NOT NULL,
  `bathrooms` TINYINT(4) NOT NULL,
  `masterEnsuite` TINYINT(1) NOT NULL,
  `bedroomsWithBathrooms` TINYINT(4) NOT NULL,
  `kitchenAndSize` TINYINT(4) NOT NULL,
  `parkingAndSlots` TINYINT(4) NOT NULL,
  `swimmingPool` TINYINT(1) NOT NULL,
  `liftsAndNumber` TINYINT(4) NOT NULL,
  `CCTV` TINYINT(1) NOT NULL,
  `sizeOfLand` INT(11) NOT NULL,
  `borehole` TINYINT(1) NOT NULL,
  `housetobuy_locationLat` DECIMAL(10,8) NOT NULL,
  `housetobuy_locationLong` DECIMAL(11,8) NOT NULL,
  `housetolet_locationLat` DECIMAL(10,8) NOT NULL,
  `housetolet_locationLong` DECIMAL(11,8) NOT NULL,
  `fullyfurnished_locationLat` DECIMAL(10,8) NOT NULL,
  `fullyfurnished_locationLong` DECIMAL(11,8) NOT NULL,
  PRIMARY KEY (`locationLat`, `locationLong`),
  INDEX `fk_generalfeatures_housetobuy1_idx` (`housetobuy_locationLat` ASC, `housetobuy_locationLong` ASC),
  INDEX `fk_generalfeatures_housetolet1_idx` (`housetolet_locationLat` ASC, `housetolet_locationLong` ASC),
  INDEX `fk_generalfeatures_fullyfurnished1_idx` (`fullyfurnished_locationLat` ASC, `fullyfurnished_locationLong` ASC),
  CONSTRAINT `fk_generalfeatures_housetobuy1`
    FOREIGN KEY (`housetobuy_locationLat` , `housetobuy_locationLong`)
    REFERENCES `foreign`.`housetobuy` (`locationLat` , `locationLong`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_generalfeatures_housetolet1`
    FOREIGN KEY (`housetolet_locationLat` , `housetolet_locationLong`)
    REFERENCES `foreign`.`housetolet` (`locationLat` , `locationLong`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_generalfeatures_fullyfurnished1`
    FOREIGN KEY (`fullyfurnished_locationLat` , `fullyfurnished_locationLong`)
    REFERENCES `foreign`.`fullyfurnished` (`locationLat` , `locationLong`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

我希望能够将行插入到 generalFeatures 没有外键约束的房屋出租表,我需要更新其他表,如 houseTobuy 或者 fullyFurnished 首先,这是因为在一个特定的情况下,我只会更新一个特定类型的房子,但没有太多的选择。在我的情况下,要出租的房子不能同时是要买的房子。

chhkpiq4

chhkpiq41#

你的数据库设计有缺陷。也就是说,您正在多个表中存储可以表示为单个记录的信息。实际上,看起来所有表都可以合并到主表中 locations :
这个 house* 表( houseToLet , houseToBuy ,…)仅用于存储位置的当前状态(出租、购买……):这可以表示为 ENUM 中的字段 location 表(如果一次可以启用多个状态,则作为多个布尔列)
这个 generalFeatures 表似乎还包含每个位置的单个记录,因此它的所有字段都可以移动到 location table。
使用一个表似乎是适合您的用例的正确设计(而且它确实避免了外部约束的问题……)。
其他注意事项:使用自动递增的整数作为主键,而不是复合键(为此,可以创建 UNIQUE 约束)。
以下是表格的ddl示例:

CREATE TABLE IF NOT EXISTS `foreign`.`location` (

    -- primary key
    `id` INT AUTO_INCREMENT,
    PRIMARY KEY (`id`),

    -- original columns
    `locationLat` DECIMAL(10,8) NOT NULL,
    `locationLong` DECIMAL(11,8) NOT NULL,
    `locationName` VARCHAR(35) NOT NULL,

    -- house status
    `status` ENUM('toLet', 'houseToBuy', 'fullyFurnished', 'landtoSell') NOT NULL,

    -- columns from `generalfeatures`
    `livingAreaAndSize` INT NOT NULL,
    `bedrooms` TINYINT(4) NOT NULL,
    `bathrooms` TINYINT(4) NOT NULL,
    `masterEnsuite` TINYINT(1) NOT NULL,
    `bedroomsWithBathrooms` TINYINT(4) NOT NULL
    -- other columns from `generalfeatures`...
)ENGINE = INNODB;

相关问题