在不存在的地方插入记录
insert record where not exist
INSERT INTO CUST_ID_HISTORY(CUST_ID,PREVIOUS_CUST_ID,UPDATE_DATE)
SELECT CUST_ID,PREVIOUS_CUST_ID,UPDATE_DATE
FROM CUST_ID_HISTORY WHERE NOT EXISTS (SELECT 1 FROM CUST_ID_HISTORY WHERE
CUST_ID='SCB301' AND PREVIOUS_CUST_ID='SCB201');
当 table.I 中插入的值不存在时,上述查询向 CUST_ID_HISTORY
插入一条新记录,遇到错误 ORA-00001: unique constraint
中提供的值,但两个值都不存在于 table.I 中table.
您的语句从 CUST_ID_HISTORY 中选择并插入到 CUST_ID_HISTORY 中。换句话说,当 CUST_ID != 'SCB301'
和 PREVIOUS_CUST_ID != 'SCB201'
没有记录时,它会尝试为 CUST_ID_HISTORY 中的每条记录创建一个重复记录。大概这是 table 的主键,因此 ORA-00001 唯一键违规。
如果您想要实现的是将这些值的记录插入 CUST_ID_HISTORY,您可能需要一个合并语句。像这样:
merge into CUST_ID_HISTORY tgt
using ( select 'SCB301' as id, 'SCB201' as prev_id
from dual ) src
on ( src.id = tgt.cust_id
and src.prev_id = tgt.prev_cust_id)
when not matched then
insert (cust_id, prev_cust_id, update_date)
values (src.id, src.prev_id, sysdate)
/
查询:
INSERT INTO CUST_ID_HISTORY(CUST_ID,PREVIOUS_CUST_ID,UPDATE_DATE)
SELECT CUST_ID,PREVIOUS_CUST_ID,UPDATE_DATE
FROM CUST_ID_HISTORY
将复制 所有 CUST_ID_HISTORY
table 的行。
添加过滤器:
WHERE NOT EXISTS (
SELECT 1
FROM CUST_ID_HISTORY
WHERE CUST_ID='SCB301' AND PREVIOUS_CUST_ID='SCB201'
);
将检查 table 中是否存在现有行 CUST_ID='SCB301' AND PREVIOUS_CUST_ID='SCB201'
如果该行不存在则 所有 来自 [=14 的行=] table 将被复制,如果存在这样的行,则该语句将插入零行。
所以您的查询要么重复所有行,要么什么都不做。
如果你想插入一个新行,检查它不存在然后:
INSERT INTO CUST_ID_HISTORY(CUST_ID,PREVIOUS_CUST_ID,UPDATE_DATE)
SELECT 'SCB301',
'SCB201',
SYSDATE -- The current date/time
FROM DUAL
WHERE NOT EXISTS (
SELECT 1
FROM CUST_ID_HISTORY
WHERE CUST_ID='SCB301' AND PREVIOUS_CUST_ID='SCB201'
);
或:
MERGE INTO CUST_ID_HISTORY dst
USING (
SELECT 'SCB301' AS CUST_ID,
'SCB201' AS PREVIOUS_CUST_ID
FROM DUAL
) src
ON ( src.CUST_ID = dst.CUST_ID
AND src.PREVIOUS_CUST_ID = dst.PREVIOUS_CUST_ID )
WHEN NOT MATCHED THEN
INSERT ( CUST_ID, PREVIOUS_CUST_ID, UPDATE_DATE )
VALUES ( src.CUST_ID, src.PREVIOUS_CUST_ID, SYSDATE );
这将同时检查是否存在现有行,如果不存在则插入一行。
INSERT INTO CUST_ID_HISTORY(CUST_ID,PREVIOUS_CUST_ID,UPDATE_DATE)
SELECT CUST_ID,PREVIOUS_CUST_ID,UPDATE_DATE
FROM CUST_ID_HISTORY WHERE NOT EXISTS (SELECT 1 FROM CUST_ID_HISTORY WHERE
CUST_ID='SCB301' AND PREVIOUS_CUST_ID='SCB201');
当 table.I 中插入的值不存在时,上述查询向 CUST_ID_HISTORY
插入一条新记录,遇到错误 ORA-00001: unique constraint
中提供的值,但两个值都不存在于 table.I 中table.
您的语句从 CUST_ID_HISTORY 中选择并插入到 CUST_ID_HISTORY 中。换句话说,当 CUST_ID != 'SCB301'
和 PREVIOUS_CUST_ID != 'SCB201'
没有记录时,它会尝试为 CUST_ID_HISTORY 中的每条记录创建一个重复记录。大概这是 table 的主键,因此 ORA-00001 唯一键违规。
如果您想要实现的是将这些值的记录插入 CUST_ID_HISTORY,您可能需要一个合并语句。像这样:
merge into CUST_ID_HISTORY tgt
using ( select 'SCB301' as id, 'SCB201' as prev_id
from dual ) src
on ( src.id = tgt.cust_id
and src.prev_id = tgt.prev_cust_id)
when not matched then
insert (cust_id, prev_cust_id, update_date)
values (src.id, src.prev_id, sysdate)
/
查询:
INSERT INTO CUST_ID_HISTORY(CUST_ID,PREVIOUS_CUST_ID,UPDATE_DATE)
SELECT CUST_ID,PREVIOUS_CUST_ID,UPDATE_DATE
FROM CUST_ID_HISTORY
将复制 所有 CUST_ID_HISTORY
table 的行。
添加过滤器:
WHERE NOT EXISTS (
SELECT 1
FROM CUST_ID_HISTORY
WHERE CUST_ID='SCB301' AND PREVIOUS_CUST_ID='SCB201'
);
将检查 table 中是否存在现有行 CUST_ID='SCB301' AND PREVIOUS_CUST_ID='SCB201'
如果该行不存在则 所有 来自 [=14 的行=] table 将被复制,如果存在这样的行,则该语句将插入零行。
所以您的查询要么重复所有行,要么什么都不做。
如果你想插入一个新行,检查它不存在然后:
INSERT INTO CUST_ID_HISTORY(CUST_ID,PREVIOUS_CUST_ID,UPDATE_DATE)
SELECT 'SCB301',
'SCB201',
SYSDATE -- The current date/time
FROM DUAL
WHERE NOT EXISTS (
SELECT 1
FROM CUST_ID_HISTORY
WHERE CUST_ID='SCB301' AND PREVIOUS_CUST_ID='SCB201'
);
或:
MERGE INTO CUST_ID_HISTORY dst
USING (
SELECT 'SCB301' AS CUST_ID,
'SCB201' AS PREVIOUS_CUST_ID
FROM DUAL
) src
ON ( src.CUST_ID = dst.CUST_ID
AND src.PREVIOUS_CUST_ID = dst.PREVIOUS_CUST_ID )
WHEN NOT MATCHED THEN
INSERT ( CUST_ID, PREVIOUS_CUST_ID, UPDATE_DATE )
VALUES ( src.CUST_ID, src.PREVIOUS_CUST_ID, SYSDATE );
这将同时检查是否存在现有行,如果不存在则插入一行。