【问题标题】:Oracle avoid duplicate key exceptionOracle避免重复键异常
【发布时间】:2014-03-29 10:14:54
【问题描述】:

我有一个带有正则表达式的查询,它接受一个字符串并拆分单词以插入表中。该表只有 2 列(TWEET 和 PALABRA),它们都构成一个主键。

查询是这样的:

INSERT INTO TWEET_PALABRAS (TWEET, PALABRA)
  SELECT 
         NEW_TWEET,
         TRANSLATE(regexp_substr(NEW_TITULO,
                                '[^[:punct:]|[:space:]]+',
                                 1,
                                 level),
                  'áéíóúÁÉÍÓÚ',
                  'aeiouAEIOU')
  FROM DUAL 
  where LENGTH(regexp_substr(NEW_TITULO, '[^[:punct:]|[:space:]]+', 1, level)) >= 5
  connect by regexp_substr(NEW_TITULO, '[^[:punct:]|[:space:]]+', 1, level) is not null;

如果一个词在推文中重复,我会遇到 duplicate key 异常,避免这种情况的正确方法是添加 ON DUPLICATE KEY UPDATE 子句,但这会导致语法错误:

INSERT INTO TWEET_PALABRAS (TWEET, PALABRA)
  SELECT 
        NEW_TWEET,
        TRANSLATE(regexp_substr(NEW_TITULO,
                                '[^[:punct:]|[:space:]]+',
                                1,
                                level), 
                  'áéíóúÁÉÍÓÚ',
                  'aeiouAEIOU')
   FROM DUAL 
  where LENGTH(regexp_substr(NEW_TITULO, '[^[:punct:]|[:space:]]+', 1, level)) >= 5
  connect by regexp_substr(NEW_TITULO, '[^[:punct:]|[:space:]]+', 1, level) is not null;
ON DUPLICATE KEY UPDATE TWEET=NEW_TWEET;

我不需要更新重复键上的任何内容,只是为了避免异常,另外,如果重复键发生,重复键之后的下一个单词也应该插入。这段代码在一个触发器内,在这个触发器之后有更多动作(因此异常块不是解决方案)。

谢谢

【问题讨论】:

    标签: oracle primary-key duplicate-data


    【解决方案1】:

    只需在查询中添加DISTINCT 即可避免重复:

    INSERT INTO TWEET_PALABRAS
      (TWEET, PALABRA)
      SELECT DISTINCT NEW_TWEET,
                      TRANSLATE(regexp_substr(NEW_TITULO,
                                              '[^[:punct:]|[:space:]]+',
                                              1,
                                              level),
                                'áéíóúÁÉÍÓÚ',
                                'aeiouAEIOU')
        FROM DUAL
       where LENGTH(regexp_substr(NEW_TITULO,
                                  '[^[:punct:]|[:space:]]+',
                                  1,
                                  level)) >= 5
      connect by regexp_substr(NEW_TITULO, '[^[:punct:]|[:space:]]+', 1, level) is not null;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-16
      • 2013-09-04
      • 1970-01-01
      • 2010-09-29
      • 2023-01-13
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      相关资源
      最近更新 更多