SQL在一个事务中插入一条带有多个关系数据的记录

时间:2014-07-24 11:09:34

标签: mysql sql

说,我有一个有很多联系人的客户档案。这意味着我将从客户表中分离联系表。

tbl_customer

  CustomerId (PK, NOT NULL, UNIQUE, AUTO_INCREMENT)
  CustomerName
  Address
  (etc)

tbl_contact

 ContactId (PK, NOT NULL, UNIQUE, AUTO_INCREMENT)
  CustomerId (FK REFERENCES tbl_customer(CustomerId), CONSTRAINT)
  Contact Type
  Contact Number

现在让我们说,一个名为John Leweinsky的客户有4个联系人。

ContactType1: Fax
ContactType2: Office Phone
ContactType3: Personal Phone
ContactType4: Personal Phone

这可以在一个查询事务中完成而不知道CustomerId吗?

如果你已经回答了这个问题,谢谢你的提前。

3 个答案:

答案 0 :(得分:1)

试试这个

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;

传递所有其他contacttype

答案 1 :(得分:0)

假设名称是唯一的,您可以这样做:

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

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

答案 2 :(得分:0)

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

您可以在不知道CustomerId的情况下添加联系人(在某些数据库引擎中,可以使用PostgreSQL作为exapmle),但是胜利者不会与John Leweinsky相关联。