복붙노트

MySQL에 '존재하지 않으면 삽입'하는 방법?

PHP

MySQL에 '존재하지 않으면 삽입'하는 방법?

나는 인터넷 검색으로 시작하여 뮤텍스 테이블에 대해 이야기하는이 기사를 발견했다.

1400 만 레코드가있는 테이블이 있습니다. 동일한 형식으로 더 많은 데이터를 추가하려는 경우 삽입하려는 레코드가 이미 존재하지 않는지 확인하는 방법이 있습니다 (즉, 한 쿼리를 확인하고 한 쿼리를 삽입하면 결과 집합이됩니다). 빈)?

필드에 대한 고유 한 제한 조건으로 인서트가 이미 존재하면 실패 할 것입니까?

그것은 단지 제약 조건과 함께, 내가 PHP를 통해 삽입을 발행하면, 스크립트가 울부 짖는 것 같습니다.

해결법

  1. ==============================

    1.

    INSERT IGNORE INTO 테이블을 사용하십시오.

    http://bogdan.org.ua/2007/10/18/mysql-insert-if-not-exists-syntax.html을 참조하십시오.

    INSERT ... DUPLICATE KEY UPDATE 문법에 대해서, dev.mysql.com에 대한 설명을 찾을 수 있습니다.

    Google의 웹 캐시에 따라 bogdan.org.ua에서 게시 :

  2. ==============================

    2.

    INSERT INTO `table` (value1, value2) 
    SELECT 'stuff for value1', 'stuff for value2' FROM `table` 
    WHERE NOT EXISTS (SELECT * FROM `table` 
          WHERE value1='stuff for value1' AND value2='stuff for value2') 
    LIMIT 1 
    

    또는 외부 SELECT 문은 테이블이 처음 비어있는 경우를 처리하기 위해 DUAL을 참조 할 수 있습니다.

    INSERT INTO `table` (value1, value2) 
    SELECT 'stuff for value1', 'stuff for value2' FROM DUAL
    WHERE NOT EXISTS (SELECT * FROM `table` 
          WHERE value1='stuff for value1' AND value2='stuff for value2') 
    LIMIT 1 
    
  3. ==============================

    3.

    중복 키 업데이트 또는 삽입 무시는 MySQL과 함께 실행 가능한 솔루션이 될 수 있습니다.

    mysql.com을 기반으로 한 중복 키 업데이트 예제

    INSERT INTO table (a,b,c) VALUES (1,2,3)
      ON DUPLICATE KEY UPDATE c=c+1;
    
    UPDATE table SET c=c+1 WHERE a=1;
    

    삽입 무시의 예는 mysql.com을 기반으로합니다.

    INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
        [INTO] tbl_name [(col_name,...)]
        {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
        [ ON DUPLICATE KEY UPDATE
          col_name=expr
            [, col_name=expr] ... ]
    

    또는:

    INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
        [INTO] tbl_name
        SET col_name={expr | DEFAULT}, ...
        [ ON DUPLICATE KEY UPDATE
          col_name=expr
            [, col_name=expr] ... ]
    

    또는:

    INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
        [INTO] tbl_name [(col_name,...)]
        SELECT ...
        [ ON DUPLICATE KEY UPDATE
          col_name=expr
            [, col_name=expr] ... ]
    
  4. ==============================

    4.

    예외가 용인 될 수있는 경우 모든 간단한 제약 조건이 작업을 수행해야합니다. 예 :

    죄송합니다, 이것은 현혹 적으로 단순 해 보입니다. 나는 당신이 우리와 공유하는 링크에 직면 해 있다고 생각합니다. ;-(

    그러나 나는 당신의 필요를 채울 것 같기 때문에이 답을 절대로주지 않습니다. (그렇지 않은 경우 "좋은 물건"(TM)이라고도 함) 요구 사항을 업데이트 할 수 있습니다.

    편집 : 삽입이 데이터베이스 고유 제한 조건을 위반하면 데이터베이스 수준에서 예외가 발생하고 드라이버가 중계합니다. 실패로 인해 스크립트를 확실히 중단합니다. 그 사건을 해결하려면 PHP에서 가능해야합니다 ...

  5. ==============================

    5.

    REPLACE INTO `transcripts`
    SET `ensembl_transcript_id` = 'ENSORGT00000000001',
    `transcript_chrom_start` = 12345,
    `transcript_chrom_end` = 12678;
    

    레코드가 있으면 덮어 씁니다. 아직 존재하지 않으면 생성 될 것입니다.

  6. ==============================

    6.

    다음은 지정된 모든 컬럼 값이 테이블에없는 경우에만 행을 삽입하는 PHP 함수입니다.

    사용 예 :

    <?php
    insert_unique('mytable', array(
      'mycolumn1' => 'myvalue1',
      'mycolumn2' => 'myvalue2',
      'mycolumn3' => 'myvalue3'
      )
    );
    ?>
    
  7. ==============================

    7.

    다음을 시도하십시오.

    IF (SELECT COUNT(*) FROM beta WHERE name = 'John' > 0)
      UPDATE alfa SET c1=(SELECT id FROM beta WHERE name = 'John')
    ELSE
    BEGIN
      INSERT INTO beta (name) VALUES ('John')
      INSERT INTO alfa (c1) VALUES (LAST_INSERT_ID())
    END
    
  8. ==============================

    8.

    교체 작업이 도움이 될 수 있습니다.

  9. ==============================

    9.

    시험:

    // Check if exist cod = 56789
    include "database.php";
    
    $querycheck = mysql_query ("SELECT * FROM `YOURTABLE` WHERE `xxx` = '56789';");
    $countrows = mysql_num_rows($querycheck);
    if($countrows == '1')
    {
      // Exist 
    }
    else
    {
     // .... Not exist
    }
    

    또는 다음을 수행 할 수 있습니다.

    // Check if exist cod = 56789
    include "database.php";
    
    $querycheck = mysql_query ("SELECT * FROM `YOURTABLE` WHERE `xxx` = '56789';");
    $countrows = mysql_num_rows($querycheck);
    while($result = mysql_fetch_array($querycheck))
    {
        $xxx = $result['xxx'];
        if($xxx == '56789')
        {
          // Exist
        }
        else
        {
          // Not exist
        }
    }
    

    이 방법은 빠르고 쉽습니다. 큰 테이블 INDEX 열 'xxx'에서 쿼리의 속도를 향상시키기 위해 (필자의 예에서는).

  10. ==============================

    10.

    ON DUPLICATE KEY 또는 INSERT IGNORE를 사용하여 확인할 수있는 UNIQUE 색인이있는 경우이를 해결하는 방법에 대한 몇 가지 해답이 있습니다. 항상 그런 것은 아니며 UNIQUE에 길이 제한 (1000 바이트)이 있으므로이를 변경할 수 없습니다. 예를 들어, WordPress (wp_postmeta)에서 메타 데이터로 작업해야했습니다.

    나는 두 가지 질문으로 마침내 그것을 풀었다.

    UPDATE wp_postmeta SET meta_value = ? WHERE meta_key = ? AND post_id = ?;
    INSERT INTO wp_postmeta (post_id, meta_key, meta_value) SELECT DISTINCT ?, ?, ? FROM wp_postmeta WHERE NOT EXISTS(SELECT * FROM wp_postmeta WHERE meta_key = ? AND post_id = ?);
    

    쿼리 1은 해당 데이터 셋이 없을 때 효과가없는 일반 UPDATE 쿼리입니다. 쿼리 2는 NOT EXISTS에 의존하는 INSERT입니다. 즉 INSERT는 데이터 집합이 존재하지 않을 때만 실행됩니다.

  11. from https://stackoverflow.com/questions/1361340/how-to-insert-if-not-exists-in-mysql by cc-by-sa and MIT lisence