【问题标题】:INSERTing values into a child table referenced from parent table将值插入到从父表引用的子表中
【发布时间】:2014-09-14 11:46:10
【问题描述】:

我昨晚整晚都在努力破解这个问题,但没有运气,所以我希望你们能提供帮助,因为我完全没有想法:

我有两个父表,我想从中填充一个 Junction 表:

新娘:

create table if not exists `Brides` ( 
    `BrideID` INT not null auto_increment,
    `MaidenName` varchar(10) unique,
    primary key (`BrideID`)
   ) engine=InnoDB;

    insert into Brides (MaidenName)
    values ('Smith'),
           ('Jones')
    ;

教会:

create table if not exists `Churches` (
`ChurchID` INT not null auto_increment,
`ChurchName` varchar(10) unique,
primary key (`ChurchID`)
) engine=InnoDB;

insert into Churches (ChurchName)
values ('St Marys'),
       ('St Albans')
;

我正在尝试通过间接引用每个父表中的唯一名称来填充连接表 Marriages 的 ID 变量。此外,我希望包含 MarriedName 以识别新娘是否不止一次结婚:

婚姻:

create table if not exists 'Marriages' (
'BrideID' INT not null,
'ChurchID' INT not null,
'MarriedName' TEXT not null
primary key ('BrideID','ChurchID','MarriedName')
  INDEX `fk_Marriages_Brides1_idx` (`BrideID` ASC),
  INDEX `fk_Marriages_Churches1_idx` (`ChurchID` ASC),
  CONSTRAINT `fk_Marriages_Brides1`
    FOREIGN KEY (`BrideID`)
    REFERENCES `Brides` (`BrideID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Marriages_Churches1`
    FOREIGN KEY (`Church_ID`)
    REFERENCES `Churches` (`ChurchID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
;   

我正在尝试执行类似以下伪代码的操作(尽管我很确定这无论如何都不是明智的做法,因为有这么多子查询一定会很慢):

insert into Marriages (Bride_ID, Church_ID, MarriedName)
  select b.BrideID, c.ChurchID, m.MarriedName
  from (values (Bride,Church,MarriedName)
         ('Smith','St Marys','Johnson'),
         ('Jones','St Albans','Peterson')
         ) m

  join Brides b
  on a.MaidenName=m.Bride
  join Churches c
  on m.Church=c.ChurchName;

您的任何帮助/见解/更正将不胜感激!

【问题讨论】:

    标签: mysql parent-child composite-primary-key insert-into junction-table


    【解决方案1】:

    试试这个:

    INSERT INTO Marriages
    SELECT b.BrideID, c.ChurchID, 'Johnson'
    FROM Brides b, Churches c
    WHERE b.MaidenName='Smith' AND c.ChurchName='St Marys'
    

    【讨论】:

    • 大声笑 - 对之前的评论感到抱歉......我已经用伪代码更新了我的原始问题,希望你知道它是否可能......!我希望能够批量输入一些使用 VALUE 语句输入的很好且清晰的记录。再次感谢。
    • 当你说你正在使用加载语句时,你的意思是你正在从 CSV(或类似的)导入?
    • 是的 - 对于我的父表,我正在从 CSV 文件加载记录,但现在我碰壁了,因为我不知道如何开始填充依赖于父表的表(与此同时,这些父表仍在“发展”,因为我充实了测试数据,因此我无法创建引用特定键 ID 变量的 CSV 文件)
    • 我认为您不能在 LOAD DATA 查询中引用现有表。我认为您需要将婚姻数据加载到临时表中,然后从那里更新您的婚姻表。
    【解决方案2】:

    为了完整起见,我想分享这个解决方案以防它对其他人有帮助....第一步和最后一步不需要更改,只需添加第二步中的“原始”数据:

    create table if not exists `_marriages` (
      `BrideName` varchar(10) null,
      `ChurchName` varchar(10) null,
      `MarriedName` varchar(10)  NULL,
     primary key (`BrideName`,`ChurchName`,`MarriedName`))
     engine=InnoDB
    ;
    
    insert into `_marriages` (BrideName,ChurchName,MarriedName)
      values 
        ('Smith','St Albans','Johnson'),
        ('Jones','St Marys','Peterson')
    ;
    
    insert into `Marriages` (Bride_ID, Church_ID, MarriedName)
    select distinct b.BrideID, c.ChurchID, a.MarriedName
    from _marriages a
    inner join Brides b
      on (a.BrideName=b.MaidenName)
    left join Churches c
      on a.ChurchName=c.ChurchName
    ;
    

    ...一如既往,如果有人在更好的方法上取得任何进展,请告诉我们!

    【讨论】:

      猜你喜欢
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      相关资源
      最近更新 更多