UPDATE trap

When update is updated with data from other data tables, if no conditions are imposed, all data will be updated, resulting in unexpected results

1. Create a data table

CREATE TABLE TEMP_TEST(
  IDN NUMBER,
  NM  VARCHAR2(10)
);

2. Insert data

INSERT INTO TEMP_TEST VALUES(1, 'A');
INSERT INTO TEMP_TEST VALUES(2, 'D');
INSERT INTO TEMP_TEST VALUES(3, 'C');
INSERT INTO TEMP_TEST VALUES(4, 'D');
COMMIT;

Write picture description here

3. Wrong update

It is planned to update the data NM of IDN 2 in the table to HELLO, after the update, the data matched by other data is updated, and the unmatched data is set to NULL

UPDATE TEMP_TEST T
SET T.NM =
(   WITH WA AS (SELECT 2 IDN, 'HELLO' AS NM FROM DUAL)
     SELECT NM
       FROM WA A
      WHERE A.IDN = T.IDN
);

Write picture description here

4. Correct updates

! Update is to add the updated range

UPDATE TEMP_TEST T
SET T.NM =
(   WITH WA AS (SELECT 2 IDN, 'HELLO' AS NM FROM DUAL)
     SELECT NM
       FROM WA A
      WHERE A.IDN = T.IDN
)
WHERE  EXISTS(
  WITH WA AS (SELECT 2 IDN, 'HELLO' AS NM FROM DUAL)
  SELECT 1 FROM WA B WHERE B.IDN = T.IDN   
);

Write picture description here

5. It is recommended to use the MERGE INTO statement when updating data

Guess you like

Origin blog.csdn.net/u012132482/article/details/53688454