2017-04-25 4 views
0

목표는 삽입하기 전에 열의 기존 값을 확인하여 중복 데이터를 삽입하지 못하게하는 것입니다. 이것은 MS SQL에서 'IF NOT EXISTS() ...'를 사용하는 것과 같은 결과입니다.중복 값 방지 오라클의 INSERT

Oracle 11g에서는이를 수행 할 수 없습니다. 필자는 Oracle PLSQL이 이와 동일한 내용을 제공하지 않는다는 것을 이해합니다. 내 이해를 바로 잡으십시오.

제 연구에서 '병합'이이 목표를 달성하는 방법임을 알게되었습니다.

내 PLSQL은 아래에 있지만 작동하지 않습니다. "0 rows merge"의 쿼리 결과

EMP 테이블에는 아래 표에 표시된 IDENTITY COLUMN ID가 있습니다.

MERGE INTO EMP E 
USING 
(SELECT ID, EMAIL FROM EMP WHERE EMAIL = '[email protected]') T 
ON (E.EMAIL = T.EMAIL) 
WHEN NOT MATCHED THEN 
INSERT 
(
    F_NAME 
    , L_NAME 
    , EMAIL 
) 
VALUES 
(
    'Employee' 
    , 'Test' 
    , '[email protected]' 
); 
COMMIT; 

EMP를 테이블의 표현

아래

"EMP" TABLE 
    ID  F_NAME   L_NAME   EMAIL 
    ------- ------------ ------------ ------------ 
    1  John   Smith   [email protected] 

NOT은 다음과 같습니다 존재하는 경우 사용에서 내 시도이다. 두 시저 및 쿼리는 MS SQL에서 잘 작동하지만, 오라클 11g에서 IF 문 다음 구문 오류를 생성합니다

CREATE OR REPLACE PROCEDURE "SPADDUPDATEEMP" 
(
    P_FNAME IN EMP.F_NAME%TYPE 
    , P_LNAME IN EMP.L_NAME%TYPE 
    , P_EMAIL IN EMP.EMAIL%TYPE 
) 
AS 
IF NOT EXISTS (SELECT * FROM EMP WHERE EMAIL = P_EMAIL) 
BEGIN 
INSERT INTO EMP 
(
    F_NAME 
    , L_NAME 
    , EMAIL 
) 
VALUES 
(
    P_FNAME 
    , P_LNAME 
    , P_EMAIL 
) 
END; 
COMMIT; 
+2

당신은'EMP를 병합하려고 :

Source

+1

Oracle과 SQL Server는 실제로 이런 종류의 쿼리와 거의 동일한 구문과 함수를 가지고 있습니다. 오라클의 SQL Server에서 사용한 것과 동일한 쿼리를 사용하면됩니다. 그래도 문제가 해결되지 않으면 쿼리와 오류를 표시하십시오. 대개 매우 사소한 변경으로 해결할 수 있습니다. – RBarryYoung

+0

@JuanCarlosOropeza 더 잘 이해하기 위해 MERGE 진술을 자세히 조사 할 것입니다. 목적은 이메일 주소가 일치하지 않을 때 병합하는 것이 었습니다. – CodeLocked

답변

1

같은 당신이 그런 식으로 쿼리 표시된 대답처럼하지만 다시 작성해야 병합 문을 수행 할 경우

ALTER TABLE EMP ADD CONSTRAINT NO_DUPLICATE UNIQUE(ID,F_NAME,L_NAME,EMAIL); 
``EMP`를 사용하여 ?? 물론 테이블에있는 이메일 때문에 병합되지 않습니다. 그리고 당신은`MATCH` 케이스에 대한 섹션을 가지고 있지 않습니다.
2

어쩌면 뭔가?

MERGE INTO EMP E 
USING 
(SELECT 'Employee'  AS F_NAME 
     ,'Test'   AS L_NAME 
     ,'[email protected]' AS EMAIL 
    FROM dual) T 
ON (E.EMAIL = T.EMAIL) 
WHEN NOT MATCHED THEN 
INSERT 
(
    F_NAME 
    ,L_NAME 
    ,EMAIL 
) 
VALUES 
(
    T.F_NAME 
    ,T.L_NAME 
    ,T.EMAIL 
); 
+1

그러면 오류가 발생합니다. 문제를 해결하지 못합니다. 이 문제를 피하면서 삽입물을 제공하려고합니다. –

+0

기본 키에 중복 삽입을 방지합니다. 나는이를 방지하기 위해 증분 함수를 사용하고 있습니다. 내 목표는 중복 데이터가 삽입되는 것을 방지하는 것입니다. – CodeLocked

+0

모든 필드에 고유 제한 조건을 추가 할 수 있습니다. 그것은 열에 중복이 없도록하는 유일한 방법입니다. – unleashed