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

기본적으로 나는 슈퍼/하위 유형으로 일하고 있어요. 사용자 정보를 가져 와서 부모 테이블 (사람)을 업데이트하고 나머지 정보를 자식 테이블 (고객)에게 전달하고 싶습니다. idPerson은 Persons 테이블의 자동 증가 PK이며,이를 Customers 테이블의 id 인 idCustomer에 대한 PK/FK로 사용하려고합니다.

프로 시저를 한 번 실행하면 '결과가 두 행 이상으로 구성됩니다'오류가 발생하고 부모 테이블 만 업데이트됩니다 ...하지만 다시 실행하면 하위 요소가 업데이트됩니다 테이블을 제대로. 어느 날 주위에 처음으로 Last_Insert_ID() 매개 변수가 null이며 그 절차가 끝난 후에 idPerson 만 업데이트된다고 생각하게 만듭니다.

나는 밤새도록 고치기를 연구했고, 이제는 이것을 해결하는 방법이 절박합니다.

답변

0

아야.

기본적으로 저는 Super/Sub 유형으로 작업하고 있습니다.

나는 그렇게 생각하지 않지만 잘못 될 수 있습니다. 고객은 일반적으로 두 당사자 (구매자와 판매자) 간의 관계를 설명합니다.

는 해당하는 수단은 어떻게 생각 나는 한 번 프로 시저를 실행하는 경우

, 그것은 오류 '결과가 둘 이상의 행으로 구성'뱉어거야? 이 쿼리는 어떤 행을 반환합니까?

SELECT lastname, firstname, count(*) 
FROM Persons 
GROUP BY lastname, firstname 
HAVING count(*) > 1; 
당신은 NULL ID 번호를 확인

,

IF PersonID IS NULL THEN 

하지만 당신은 SELECT 문이 먼저 같은이 사람들을 위해 2 개 또는 3 또는 42 다른 ID 번호를 모두 반환 할 수있는 가능성을 무시 성. 그게 현명한거야? 다른 말로 표현하면 {firstname, lastname}에 UNIQUE 제약 조건이 있습니까?

PersonID가 null 인 경우 Person에 행을 삽입하면 LAST_INSERT_ID()가 반환 할 수있는 값이 설정됩니다. 그러나 두 번째 INSERT는 행이 이전에 Person에 삽입되었는지 여부에 관계없이 LAST_INSERT_ID()를 사용하려고합니다.

마지막으로, 당신은 당신이 최대 하나의 필요 확신

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

의 약간 다른 두 가지 버전이 있습니다.

관련 문제