2011-04-10 82 views
0

你好我正在做一个数据库任务,我被困在如何做到这一个存储过程。虽然它的工作原理,有点...通过存储过程将信息插入父/子表中?

DELIMITER //

CREATE PROCEDURE AddANewCustomer(IN firstName char(20), IN lastName char(20), IN companyName char(45), IN streetAddress char(60), IN city char(30), IN province char(45), IN postalCode char(6), IN phoneNumber int(10)) 

BEGIN 
     DECLARE PersonID INT; 

     SELECT idPerson FROM Persons WHERE Persons.firstName = firstName AND Persons.lastName = lastName INTO PersonID; 

     IF PersonID IS NULL THEN 

     INSERT INTO Persons(firstName, lastName, streetAddress, city, province, postalCode, phoneNumber) VALUES (firstName, lastName, streetAddress, City, Province, postalCode, phoneNumber); 

     SELECT idPerson FROM Persons WHERE firstName = firstName AND lastName = lastName INTO PersonID; 

     END IF; 

     INSERT INTO Customers(idCustomer, companyName) VALUES (Last_Insert_ID(), companyName); 

END // 

DELIMITER ; 

基本上我与超/子类型的工作。我想从用户那里获取信息,然后更新我的父表(Persons),并将剩余的信息传递给我的子表(Customers)。 idPerson是Persons表的自动递增PK,我想将它用作Customers表的id,idCustomer的PK/FK。

如果我运行一次该过程,它会吐出一个错误'结果包含多行',只有父表得到更新...但是如果我再次运行它,它会更新孩子表格正确。这让我认为Last_Insert_ID()参数第一次为null,并且在过程完成后idPerson才会更新。

我已经研究了整个晚上的修复,现在我绝对难以解决这个问题。

回答

0

Ouch。

基本上我正在使用Super/Sub 类型。

我不这么认为,但我可能是错的。 客户通常描述双方之间的关系,一方是买方,另一方是卖方。

如果我的程序运行一次,它会 吐出一个错误“结果包括 多行”

你觉得这意味着什么?此查询是否返回任何行?

SELECT lastname, firstname, count(*) 
FROM Persons 
GROUP BY lastname, firstname 
HAVING count(*) > 1; 

您检查空ID号,

IF PersonID IS NULL THEN 

,但你忽略了你的SELECT语句可能会返回2或3个或42个不同的ID号,所有谁具有相同的第一人的可能性和姓氏。这是明智的吗?换句话说,你对{firstname,lastname}有一个UNIQUE约束吗?

如果PersonID为null,则向Person插入一行,该行设置LAST_INSERT_ID()可以返回的值。但是,您的第二个INSERT尝试使用LAST_INSERT_ID(),而不考虑以前是否将行插入到人员中。

最后,你有两个略有不同版本的

SELECT idPerson 
FROM Persons 
WHERE Persons.firstName = firstName 
    AND Persons.lastName = lastName 
INTO PersonID; 

我敢肯定,你需要一个最多。