2017-04-25 247 views
0

我的目標是通過在插入前檢查列中的現有值來防止插入重複數據。這與在MS SQL中使用'IF NOT EXISTS()...'的效果相同。防止重複值在ORACLE中插入

我無法在Oracle 11g中完成此操作。我知道Oracle PLSQL沒有提供相同的語句來執行此操作。請糾正我的理解。

在我的研究中,我發現'MERGE'是實現這一目標的一種方法。

我的PLSQL在下面,但是不起作用。 「0行合併」中的查詢結果

EMP表具有下表中所示ID的IDENTITY COLUMN。

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] 

我在使用IF NOT EXISTS低於嘗試。無論proc和查詢在MS SQL工作得很好,但IF語句在Oracle 11g中後產生語法錯誤:

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 '使用'EMP'?當然不會合並,因爲電子郵件已經在桌面上了。並且您沒有爲「MATCH」情況設置章節 –

+1

Oracle和SQL Server實際上對這種查詢具有幾乎相同的語法和功能。只需使用您在Oracle上的SQL Server中使用的相同查詢即可。如果這不起作用,那麼向我們展示查詢和錯誤,通常可以通過非常小的修改來解決。 – RBarryYoung

+0

@JuanCarlosOropeza我將進一步調查MERGE語句以更好地理解它的構造。目的是在電子郵件地址不匹配時合併。 – CodeLocked

回答

1

如果你想要做同樣喜歡明顯的答案,但你應該重寫MERGE語句,你以這種方式查詢:

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 
); 
2

也許這樣的事情?

ALTER TABLE EMP ADD CONSTRAINT NO_DUPLICATE UNIQUE(ID,F_NAME,L_NAME,EMAIL); 

Source

+1

這會引發錯誤。不解決問題。你想提供一個避免這個問題的插入 –

+0

這將防止主鍵上的重複插入。我正在使用增量功能來防止這種情況。我的目標是防止插入重複的數據。 – CodeLocked

+0

您可以在任何字段上添加唯一約束。這將是確保列中不存在重複的唯一方法。 – unleashed