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