2011-04-10 44 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; 

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