Mysql SQL在一个事务中插入一条包含多个关系数据的记录

Mysql SQL在一个事务中插入一条包含多个关系数据的记录,mysql,sql,Mysql,Sql,比如说,我有一个有很多联系人的客户档案。这意味着我将把联系人表和客户表分开 待定客户 CustomerId (PK, NOT NULL, UNIQUE, AUTO_INCREMENT) CustomerName Address (etc) tbl\U联系人 ContactId (PK, NOT NULL, UNIQUE, AUTO_INCREMENT) CustomerId (FK REFERENCES tbl_customer(CustomerId), CONSTRAI

比如说,我有一个有很多联系人的客户档案。这意味着我将把联系人表和客户表分开

待定客户

  CustomerId (PK, NOT NULL, UNIQUE, AUTO_INCREMENT)
  CustomerName
  Address
  (etc)
tbl\U联系人

 ContactId (PK, NOT NULL, UNIQUE, AUTO_INCREMENT)
  CustomerId (FK REFERENCES tbl_customer(CustomerId), CONSTRAINT)
  Contact Type
  Contact Number
现在,假设一位名叫约翰·莱温斯基的客户有4个联系人。

ContactType1: Fax
ContactType2: Office Phone
ContactType3: Personal Phone
ContactType4: Personal Phone
是否可以在不知道客户ID的情况下在一个查询事务中完成此操作


如果您已回答此问题,请提前通知。

假设名称是唯一的,您可以通过以下方式执行此操作:

insert into tbl_contact(CustomerId, ContactType, ContactNumber)
    select cust.CustomerId, c.ContactType, c.ContactNumber
    from (select 'Fax' as ContactType, Faxnumber as ContactNumber union all
          select 'Office', Officenumber union all
          select 'PersonalPhone', PersonalPhone union all
          select 'PersonalPhone', PersonalPhone
         ) c cross join
         Customers cust
    where cust.CustomerName = 'John Leweinsky';

如果名称不唯一,您需要某种方法来消除客户的歧义。

不,向tbl_联系人中正确添加内容的唯一方法是使用CustomerId。您的客户名称不是唯一的(也不应该是唯一的),因此您无法将您的联系人与John Leweinsky联系起来,除非这只是一个玩具示例,您想假装John Leweinsky是唯一的

您可以在不知道CustomerId的情况下添加联系人(在某些数据库引擎中,例如PostgreSQL),但不会连接到John Leweinsky。

尝试这样做

START TRANSACTION;

insert into (feilds name) values(Values);

insert into tbl_contact(CustomerId ,ContactType,ContacNumber) 
values((select max(CustomerId) from tbl_customer),'type1','Fax');

COMMIT;

传递所有其他联系人类型

如果您不知道客户ID,您将插入什么?这是个问题,我不确定我的想法是否正确。但是等待有人证明:)
CustomerName
是唯一的还是非唯一的CustomerName不是唯一的?你想同时插入
tbl_customer
tbl_contact
吗?我想我不知道客户ID就不能这样做,对吗?@lannyboy。如果您正在联系人表中存储
CustomerId
,则不会。根据数据库的不同,有时会有其他选择,比如带有触发器的可插入视图。好吧,就像我在上一篇文章中所说的:例如,在我的公司,有3个人叫“Rob Martin”。上面的问题将是模棱两可的:)嗯,在我的公司里有三个人叫“Rob Martin”。如果上面的查询是不明确的:)那么我的事务在提交时必须被锁定?如果您有一个客户到多个联系人,而没有将客户名称放在“唯一”中,您将如何更改表设计?保存数据是存储过程,使用相同的概念。保存第一个表。然后在商店的第二张桌子@lannyboy之后获得max id我的意思是有没有办法调整这个设计而不是传统的提交?在我的办公室,这个过程正在进行,只有我建议你。使用带有回滚选项的存储过程如果发生任何异常,事务将回滚,否则将提交