Mysql 将值插入从父表引用的子表中

Mysql 将值插入从父表引用的子表中,mysql,parent-child,composite-primary-key,insert-into,junction-table,Mysql,Parent Child,Composite Primary Key,Insert Into,Junction Table,我昨晚一整晚都在努力破解这个问题,但运气不好,所以我希望你们能帮我,因为我已经没有主意了: 我有两个父表,我想从中填充连接表: 新娘: create table if not exists `Brides` ( `BrideID` INT not null auto_increment, `MaidenName` varchar(10) unique, primary key (`BrideID`) ) engine=InnoDB; insert int

我昨晚一整晚都在努力破解这个问题,但运气不好,所以我希望你们能帮我,因为我已经没有主意了:

我有两个父表,我想从中填充连接表:

新娘:

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')
;
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)
;   
教堂:

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')
;
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)
;   

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

婚姻:

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')
;
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
SELECT b.BrideID, c.ChurchID, 'Johnson'
FROM Brides b, Churches c
WHERE b.MaidenName='Smith' AND c.ChurchName='St Marys'

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

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
;

…一如既往,如果任何人在更好的方式上有任何进展,请让我们知道

lol-很抱歉之前的评论…我已经用伪代码更新了我的原始问题,希望你知道这是否可能。。。。!我希望能够批量输入一些记录,这是很好的和明确的输入值语句。再次感谢。当您说您正在使用load语句时,您的意思是从CSV(或类似文件)导入吗?是的-对于我的父表,我正在从CSV文件加载记录,但现在我遇到了一个难题,因为我不知道如何开始填充依赖于父表的表(与此同时,随着我充实测试数据,这些父表仍在“发展”,因此无法创建引用特定键ID变量的CSV文件)我不认为您可以在
LOAD DATA
查询中引用现有表。我认为您需要将婚姻数据加载到临时表中,然后从那里更新婚姻表。