您好我正在进行数据库分配,而我仍然坚持如何执行此一个存储过程。虽然它有效但有点......
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只在程序完成后才更新。
我整晚都在研究修复,现在我对如何解决这个问题感到非常难过。
答案 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;
我很确定你最多需要一个。