Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 防止在ORACLE中插入重复值_Sql_Oracle_Plsql_Merge - Fatal编程技术网

Sql 防止在ORACLE中插入重复值

Sql 防止在ORACLE中插入重复值,sql,oracle,plsql,merge,Sql,Oracle,Plsql,Merge,我的目标是通过在插入之前检查列中的现有值来防止插入重复数据。这与在MS SQL中使用“IF NOT EXISTS()…”的效果相同 我无法在Oracle 11g中实现这一点。据我所知,Oracle PLSQL并没有提供与此相同的语句。请纠正我的理解 在我的研究中,我发现“合并”是实现这一目标的一种方式 我的PLSQL在下面,但是不工作。“0行合并”中的查询结果 EMP表中的标识列ID如下表所示 MERGE INTO EMP E USING (SELECT ID, EMAIL FROM EMP

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

我无法在Oracle 11g中实现这一点。据我所知,Oracle PLSQL并没有提供与此相同的语句。请纠正我的理解

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

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

EMP表中的标识列ID如下表所示

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


也许是这样的

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

如果您想像标记的答案一样执行相同的操作,但使用merge语句,您应该以这种方式重写查询:

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

您正在尝试使用
EMP
合并
EMP
??当然不会合并,因为电子邮件已经在表中。而且你没有一个匹配案例的部分。实际上,Acle和SQL Server对于这种查询有几乎相同的语法和函数。只需使用在Oracle上的SQL Server中使用的相同查询即可。如果这不起作用,那么向我们显示查询和您得到的错误,通常只需稍作修改即可修复。@JuanCarlosOropeza我将进一步研究MERGE语句,以更好地理解它的构造。目的是在电子邮件地址不匹配时进行合并。问题中没有PL/SQL。平淡无奇SQL@RBarryYoung添加如果不存在错误,我收到,因为我现在知道这可以通过两种方式完成。完美。标记为答案。这将引发错误。这并不能解决问题。您希望提供插入以避免此问题这将防止在主键上重复插入。我正在使用增量函数来防止这种情况。我的目标是防止插入重复数据。您可以在任何字段上添加唯一约束。这将是确保列中没有重复项的唯一方法。
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
);