通过存储过程将信息插入父/子表?

时间:2011-04-10 14:00:08

标签: mysql database-design

您好我正在进行数据库分配,而我仍然坚持如何执行此一个存储过程。虽然它有效但有点......

  

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 ;

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

如果我运行一次该程序,它会发出错误'结果由多行组成'并且只有父表更新...但如果我再次运行它,它将更新子表正常。这让我觉得Last_Insert_ID()参数第一次为空,而idPerson只在程序完成后才更新。

我整晚都在研究修复,现在我对如何解决这个问题感到非常难过。

1 个答案:

答案 0 :(得分:0)

哎哟。

  

基本上我正在使用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,则向Persons插入一行,该行设置LAST_INSERT_ID()可以返回的值。但是你的第二个INSERT试图使用LAST_INSERT_ID(),而不考虑先前是否有人插入人员。

最后,您有两个略有不同的

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

我很确定你最多需要一个。