【问题标题】:Preventing a Duplicate value INSERT in ORACLE在 ORACLE 中防止重复值插入
【发布时间】:2017-04-25 19:19:56
【问题描述】:

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

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

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

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

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

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;

EMP 表的表示如下

"EMP" TABLE
    ID       F_NAME          L_NAME          EMAIL
    -------  ------------    ------------    ------------
    1        John            Smith           test@email.com

我使用 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;

【问题讨论】:

  • 您正在尝试使用EMP 合并EMP ??当然不会合并,因为电子邮件已经在桌面上。而且您没有针对MATCH 案例的部分
  • Oracle 和 SQL Server 实际上对于此类查询具有几乎相同的语法和功能。只需使用您在 Oracle 上的 SQL Server 中使用的相同查询。如果这不起作用,请向我们展示您得到的查询和错误,通常可以通过非常小的更改来修复它。
  • @JuanCarlosOropeza 我将进一步研究 MERGE 语句以更好地理解它的构造。目的是在电子邮件地址不匹配时进行合并。
  • 问题中没有PL/SQL。只有普通的 SQL
  • @RBarryYoung 添加了 IF NOT EXISTS 并收到错误,因为我现在知道这可以通过两种方式完成。

标签: sql oracle plsql merge


【解决方案1】:

也许是这样的?

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

Source

【讨论】:

  • 这将引发错误。不解决问题。你想提供一个避免这个问题的插入
  • 这将防止在主键上重复插入。我正在使用增量功能来防止这种情况。我的目标是防止插入重复数据。
  • 您可以在任何字段上添加唯一约束。这将是确保列中没有重复项的唯一方法。
【解决方案2】:

用途:

INSERT INTO emp(
  F_NAME
  , L_NAME 
  , EMAIL
)
SELECT 
    'Employee'
  , 'Test'
  , 'ZZZZ@email.com'
FROM dual
WHERE NOT EXISTS (
   SELECT 1 FROM emp WHERE EMAIL = 'ZZZZ@email.com'
);

【讨论】:

  • 完美。标记为答案。
【解决方案3】:

如果您想像标记的答案一样做同样的事情,但使用合并语句,您应该以这种方式重写您的查询:

MERGE INTO EMP E
USING 
(SELECT 'Employee'       AS F_NAME
       ,'Test'           AS L_NAME
       ,'ZZZZ@email.com' 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
);

【讨论】:

    猜你喜欢
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2016-02-19
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多