为什么我在插入时会违反此唯一约束

时间:2011-11-22 10:35:51

标签: sql oracle

我通过从另一个可能有重复的表中选择将数据插入表中。我认为我的查询是通过检查行是否已经存在而处理此问题但是我遇到了一个唯一的约束违规。

以下是查询:

INSERT INTO FOLDER_USER (FOLDER_ID, USER_ID) 
    SELECT DECODE(FOLDERID,'F10', '1','F565','2','F11', '3','F81', '4','0'), USERID
    FROM DATA1.FOLDERS F1
    WHERE UPPER(OWNER) = 'ADMIN'
    AND NOT EXISTS 
        (SELECT 1 FROM FOLDER_USER F2  
         WHERE DECODE(FOLDERID,'F10', '1','F565','2','F11', '3','F81', '4','0')= F2.FOLDER_ID 
         AND F1.USERID = F2.USER_ID);
  • 表格FOLDER_USER包含2列FOLDER_ID(数字),USER_ID (varchar)并组合起来构成主键
  • 表格FOLDERS包含2列FOLDERID和USERID(两个varchars)。价值 在FOLDERID中需要根据其值将其解码为数字 在插入新表之前

2 个答案:

答案 0 :(得分:3)

原因可能是对如何执行此类sql语句的误解。

首先选择所有行。然后将它们全部插入表中。这意味着您的exists子句不会看到先前由相同语句插入的行

通过查看语句,您可能会认为它插入了一行,然后像时尚一样选择循环中的下一个。事实并非如此。

答案 1 :(得分:2)

您选择的行可能并不是唯一的。

尝试:

INSERT INTO folder_user( folder_id,
                         user_id)
   SELECT UNIQUE 
          DECODE( folderid,  'F10', '1',  'F565', '2',  'F11', '3',  'F81', '4',  '0' ),
          userid
     FROM data1.folders f1
    WHERE UPPER( owner ) = 'ADMIN'
          AND NOT EXISTS
                 (SELECT 1
                    FROM folder_user f2
                   WHERE DECODE( folderid,  'F10', '1',  'F565', '2',  'F11', '3',  'F81', '4',  '0' ) = f2.folder_id
                         AND f1.userid = f2.user_id);