防止 ORACLE 中的重复值 INSERT

Cod*_*ked 0 sql oracle merge plsql

我的目标是通过在插入之前检查列中的现有值来防止插入重复数据。这与在 MS SQL 中使用“IF NOT EXISTS ()...”的效果相同。

我无法在 Oracle 11g 中完成此操作。我了解 Oracle PLSQL 不提供相同的语句来执行此操作。请纠正我的理解。

在我的研究中,我发现“合并”是实现这一目标的一种方式。

我的 PLSQL 在下面,但是不起作用。查询结果为“0 行合并”

EMP 表确实具有 ID 的 IDENTITY COLUMN,如下表所示。

MERGE INTO EMP E
USING 
(SELECT ID, EMAIL FROM EMP WHERE EMAIL = 'test@email.com') T
ON (E.EMAIL = T.EMAIL)
WHEN NOT MATCHED THEN
INSERT  
(
  F_NAME
  , L_NAME 
  , EMAIL
)
VALUES
(
  'Employee'
  , 'Test'
  , 'ZZZZ@email.com'
);
COMMIT;
Run Code Online (Sandbox Code Playgroud)

EMP 表的表示如下

"EMP" TABLE
    ID       F_NAME          L_NAME          EMAIL
    -------  ------------    ------------    ------------
    1        John            Smith           test@email.com
Run Code Online (Sandbox Code Playgroud)

我使用 IF NOT EXISTS 的尝试如下。proc 和 query 在 MS SQL 中都运行良好,但在 Oracle 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;
Run Code Online (Sandbox Code Playgroud)

joo*_*juh 5

也许是这样的?

ALTER TABLE EMP ADD CONSTRAINT NO_DUPLICATE UNIQUE(ID,F_NAME,L_NAME,EMAIL);
Run Code Online (Sandbox Code Playgroud)

来源

  • 这将引发错误。不解决问题。你想提供一个插入来避免这个问题 (2认同)