MySQL의 여러 업데이트

한 번에 여러 행을 삽입할 수 있다는 것을 알고 있는데, MySQL에서 한 번에 여러 행을 업데이트할 수 있는 방법이 있나요(예: 하나의 쿼리에서)?

편집 예를 들어 다음과 같습니다.

Name   id  Col1  Col2
Row1   1    6     1
Row2   2    2     3
Row3   3    9     5
Row4   4    16    8

다음 모든 업데이트를 하나의 쿼리로 결합하고 싶습니다.

UPDATE table SET Col1 = 1 WHERE id = 1;
UPDATE table SET Col1 = 2 WHERE id = 2;
UPDATE table SET Col2 = 3 WHERE id = 3;
UPDATE table SET Col1 = 10 WHERE id = 4;
UPDATE table SET Col2 = 12 WHERE id = 4;
해결책

39 의 가능한 - 삽입하십시오 that& 그러하너라 사용할 수 있습니다. 복제본임을 대한 주요 업데이트하십시오.

사용 예제:

INSERT INTO table (id,Col1,Col2) VALUES (1,1,1),(2,2,3),(3,9,3),(4,10,12)
ON DUPLICATE KEY UPDATE Col1=VALUES(Col1),Col2=VALUES(Col2);
해설 (16)

이후 동적임 값뿐만 사용하는 데 필요한 경우 가지고 있는 경우 또는 열을 대한 업데이트되어야. 하지만 it gets 좀 추악한 노력해야 합니다.

예를 들어, 사용 할 수 있는 it like: &lt pre>; 테이블 세트 케이스 id = 업데이트하십시오 Col1 그 때 1 1 그 때 2 2 그 후 10 시 4 다른 Col1 끝 Col2 = 케이스 id 그 때 3 3 그 때 12 4 다른 Col2 END 여기서 id 인 (1, 2, 3, 4). &lt /pre>;

해설 (2)

문제는 아직 I&; d # 39 세) 등 다른 답을 항목를 확대할 수 있는.

내 말은, 마무리를 지을 수 있는 가장 쉬운 방법은 바로 여러 쿼리합니다 트랜잭션입니다. '이 수락됨 오토메이티드 삽입하십시오. 하지만 한 가지 중요한 일 '은 좋은 복제본임을 업데이트하십시오 해킹, 그 단점 및 한계에는 점에 유의해야 합니다.

  • 部门是这样的 말하였노라 생기는 경우, 그 기본 키 don& 실행하십시오 포함된 쿼리입니다 행뿐만 존재하는 t # 39 표, 새로운 &quot 쿼리하지 삽입물의 half-baked"; 레코드는유지합니다. # 39 의 it& 원하지 않는 것이다.
  • Not null 필드이므로 있으면 있는 테이블 없이, t want to touch 기본값과 don& # 39 이 필드에서 you& # 39, & # 39, 현장 'll get 쿼리하지 &quot fieldname& # 39;; # 39 doesn& 없는 경우에도 '경고, MySQL, 기본 value&quot don& # 39, 단일 행일 삽입하십시오 전혀 없다. 곤경에 빠지는 것이라고 할 수 있습니다, 결정하면 엄격하고 선반가공 mysql 개의경고 salesforce. 런타임용으로 개발하십시오 예외 in your app.

I made 3 '의 성능 테스트 등 일부 제안됩니다 삽입하십시오 만든다. 변형, 변형, 사건 때 함께 '의 주요 업데이트하십시오 복제본임을 &quot / / then&quot. 조항 및 소박한 방식으로 트랜잭션입니다. [Here] 파이썬 코드 및 결과를 얻을 수 있습니다 (https://gist.github.com/imankulov/5849790). 전체적인 결론을 내릴 수 있는 것으로 드러날 경우 기술서임을 에로남이네 변형 등 2 가지의 it& # 39 의 두 배 빨리 상당히 어려운 코드를 작성할 수 있지만, 그래서 개인적으로 가장 정확하고 분사 안전하다구요 외곽진입 일이다. flexlm*용 트랜잭션입니다.

해설 (5)

또 다른 유용한 옵션은 왜 아직 확실하지 않았다.

UPDATE my_table m
JOIN (
    SELECT 1 as id, 10 as _col1, 20 as _col2
    UNION ALL
    SELECT 2, 5, 10
    UNION ALL
    SELECT 3, 15, 30
) vals ON m.id = vals.id
SET col1 = _col1, col2 = _col2;
해설 (3)

다음 모든 InnoDB 적용됩니다.

기분이 속도용으로 3 가지 방법을 아는 것이 중요합니다.

3 가지 방법:

  1. 삽입하십시오: 에서 삽입하십시오 복제본임을 주요 업데이트
  2. 트랜잭션까지: 할 수 있는 트랜잭션 내에서 각 레코드에 대한 업데이트하려면
  3. 사례: 이 때 각기 다른 레코드에는 업데이트하려면 너희에의 케이스 /
  • 빠른 방법, 그리고 당시 이 그냥 테스트되었습니다 삽입하십시오 *6.7x 가져다줄래요 비해 트랜잭션까지 메서드입니다. 집합에 대한 3000 및 30,000 행뿐만 모두 찾았다.

실행할 수 있는 시간이 아직 트랜잭션 방법은 각 개별적으로 메모리에 배치, 또는 결과를 쿼리하지 않더라도 뭔가 실행하는 동안. 꽤 비싼 트랜잭션 방법은 또한 모두 복제 및 쿼리하지 로깅합니다.

  • 삽입, 사건 당시 해도 그 방법을 41.1x 보다 느린 메서드입니다 w / 30,000 레코드 (6.1x 보다 느린 트랜잭션까지). Myisam 의 및 75x * 느립니다. 사고가 발생한 경우 방법 및 삽입하십시오 때에도 ~ 1,000 레코드는유지합니다. 100 기록, 사건 때에도 메서드입니다 간신히 가속화합니다.

그래서 일반적으로 최고의 그리고 가장 편리한 방법은 모두 삽입하십시오 느낍니다. 크기가 작은 쿼리합니다 쉽게 읽을 수 있는 유일한 시행하십시오 쿼리하지 1 위로 및 작업. Innodb 및 MyISAM 이 모두 적용됩니다.

  • 보너스 stuff:*

문제는 해결책 제시 비사양 기본 필드 삽입하십시오 일시적으로 선반가공 끕니까 관련 sql 모드: '설정 세션 sql_mode = REPLACE (바꾸기 (@@SESSION.sql_mode, &quot, STRICT_TRANS_TA BLES", &quot ";), &quot STRICT_AL &quot &quot L_TABLES";;;)'. '어떻게' 첫 계획이면 sql_mode smartupdate 저장할 수 있습니다.

39 로 I& 다른 의견을 말하는 방법을 사용하여, ve seen that I 테스트되었습니다 auto_increment 올라간다 삽입하십시오 않을 경우 너무 및 것으로 보인다.

테스트 코드를 실행하십시오 이렇다. 또한 php 파일을 출력입니다 지스크라 지루려면 오버헤드에 인터프리터


<?
//Variables
$NumRows=30000;

//These 2 functions need to be filled in
function InitSQL()
{

}
function RunSQLQuery($Q)
{

}

//Run the 3 tests
InitSQL();
for($i=0;$i
해설 (6)

임시 테이블을 사용하여

// Reorder items
function update_items_tempdb(&$items)
{
    shuffle($items);
    $table_name = uniqid('tmp_test_');
    $sql = "CREATE TEMPORARY TABLE `$table_name` ("
        ."  `id` int(10) unsigned NOT NULL AUTO_INCREMENT"
        .", `position` int(10) unsigned NOT NULL"
        .", PRIMARY KEY (`id`)"
        .") ENGINE = MEMORY";
    query($sql);
    $i = 0;
    $sql = '';
    foreach ($items as &$item)
    {
        $item->position = $i++;
        $sql .= ($sql ? ', ' : '')."({$item->id}, {$item->position})";
    }
    if ($sql)
    {
        query("INSERT INTO `$table_name` (id, position) VALUES $sql");
        $sql = "UPDATE `test`, `$table_name` SET `test`.position = `$table_name`.position"
            ." WHERE `$table_name`.id = `test`.id";
        query($sql);
    }
    query("DROP TABLE `$table_name`");
}
해설 (0)
UPDATE table1, table2 SET table1.col1='value', table2.col1='value' WHERE table1.col3='567' AND table2.col6='567'

이 정도면 충분할 겁니다.

여러 테이블에 대한 참조는 MySQL 매뉴얼에 있습니다.

해설 (0)

왜 아무도 쿼리하지 한 여러 명령문입니다 하라님의 ?

Php 에서 사용하는 방법을 multi_query ',' 미스크리 인스턴스입니다.

1 의 [php 수작업식] &gt. MySQL 선택적으로 사용하면 여러 개 명령문입니다 한 기술서임을 구체화하십시오. 하지만 한 번에 여러 차례 보내는 제표를 낮춰줍니다 클라이언트-서버 라운드하지 특수 처리가 필요합니다.

다음은 비교한 결과 다른 방법으로 3 업데이트 30,000 기초형상. Here 코드를 기반으로 하는 @Dakusan 답을 찾을 수 있습니다.

  • 트랜잭션: 5.5194580554962 &lt br>; 삽입하십시오: 0.20669293403625 &lt br>; 사례: 16.474853992462 &lt br>; 멀티. 0.0412278175354 * br&gt <;

보시는 바와 같이 여러 명령문입니다 질의입니다 비해 보다 효율적인 최고 대답.

오류 메시지가 나타날 경우 다음과 같습니다.

PHP Warning:  Error while sending SET_OPTION packet

Mysql 에서 할 수 있습니다 '는' 내 'max_allowed_packet 증가되지는 구성 파일 시스템에 있는 mysqld /etc/mysql/my.cnf' 다시 시작합니다.

해설 (5)

같은 날 비난할 수 있습니다, s # 39 표를 앨리어스가 id& 운영까지도 삽입하려면 승인자 (행 단위 수행할 경우 업데이트:

UPDATE table1 tab1, table1 tab2 -- alias references the same table
SET 
col1 = 1
,col2 = 2
. . . 
WHERE 
tab1.id = tab2.id;

또한, 다른 테이블의 업데이트 할 수 있는 것 또한 명백하네 잘 알려져 있다. 이 경우 업데이트 역할도 수행하는 &quot SELECT"; 기술서임을 틀렸다니까 specifying 테이블에서 데이터를 제공합니다. 따라서 두 번째 표 값을 업데이트 한다는 틀렸다니까 명시적으로 쿼리하지 환경의 영향을 받지 않습니다.

해설 (0)

39, & # 39 라는 멀티 statement& 좁히어 가 설정을 변경할 수 있습니다. # 39, & # 39 에 있는 MySQL& 비활성화합니다 안전 mechanism& # 39. (두 개 이상의 것을 막기 위해 구현됩니까 사출 함장님이요 # 39, & # 39 의 일반적인 MySQL& brilliant& # 39. 또 효율적인 구현 하는 것을 준비되기까지 질의입니다.

여기 (http://dev.mysql.com/doc/refman/5.1/en/mysql-set-server-option.html) 는 일부 정보는 C 의 구현이 설정값입니다.

39 you& PHP 사용 할 경우, re 멀티 명령문입니다 미스크리 사용할 수 있습니다 (php 는 이제 함께 한동안 미스크리 생쥐라.)

$con = new mysqli('localhost','user1','password','my_database');
$query = "Update MyTable SET col1='some value' WHERE id=1 LIMIT 1;";
$query .= "UPDATE MyTable SET col1='other value' WHERE id=2 LIMIT 1;";
//etc
$con->multi_query($query);
$con->close();

도움이 되길 바란다.

해설 (3)

업데이트에 조인을 사용하는 것도 가능할 수 있습니다.

Update someTable Set someValue = 4 From someTable s Inner Join anotherTable a on s.id = a.id Where a.id = 4
-- Only updates someValue in someTable who has a foreign key on anotherTable with a value of 4.

편집: 업데이트하려는 값이 데이터베이스의 다른 곳에서 가져오지 않는 경우 여러 업데이트 쿼리를 실행해야 합니다.

해설 (0)

사용

REPLACE INTO`table` VALUES (`id`,`col1`,`col2`) VALUES
(1,6,1),(2,2,3),(3,9,5),(4,16,8);

참고:

  • id 는 to be a 주 고유 키
  • 외국인 키를 사용하는 경우 그 때문에 이 권능은하나님께 삽입물의 복귀시킴 deletes 테이블을 참조 오류가 발생할
해설 (0)

다음은 한 테이블의 모든 행을 업데이트합니다.

Update Table Set
Column1 = 'New Value'

다음은 열2의 값이 5보다 큰 모든 행을 업데이트합니다.

Update Table Set
Column1 = 'New Value'
Where
Column2 > 5

둘 이상의 테이블을 업데이트하는 예제는 모두 Unkwntech의 예제입니다.

UPDATE table1, table2 SET
table1.col1 = 'value',
table2.col1 = 'value'
WHERE
table1.col3 = '567'
AND table2.col6='567'
해설 (0)

Update sql 삽입 키를 사용하여 복제본임을 그러하너라 .it 사용할 수 있는 것이다. 문법: 삽입하십시오 table_name (a, b,c) 값 (1.2,3), (4.5,6) 키 값 (a) 의 값을 a = b = 복제본임을 업데이트하십시오 (b), c = 값 (c)

해설 (0)

Php 나 있는 이런게야. 이를 통해 사용 후 세미콜론 분할합니다 어레이입니다 제출됩니다 루프지

$con = new mysqli('localhost','user1','password','my_database');
$batchUpdate = true; /*You can choose between batch and single query */
$queryIn_arr = explode(";", $queryIn);

if($batchUpdate)    /* My SQL prevents multiple insert*/
{
    foreach($queryIn_arr as $qr)
    {
        if(strlen($qr)>3)
        {
            //echo '<br>Sending data to SQL1:<br>'.$qr.'</br>';
            $result = $conn->query($qr);
        }

    }
}
else
{
    $result = $conn->query($queryIn);
}
$con->close();
해설 (0)
UPDATE tableName SET col1='000' WHERE id='3' OR id='5'

이렇게 하면 어떤 you& 이룹니까 # 39, r 찾고 있습니다. # 39 더 추가하기만 id&, s. 나는 테스트됨 거잖나.

해설 (0)
UPDATE `your_table` SET 

`something` = IF(`id`="1","new_value1",`something`), `smth2` = IF(`id`="1", "nv1",`smth2`),
`something` = IF(`id`="2","new_value2",`something`), `smth2` = IF(`id`="2", "nv2",`smth2`),
`something` = IF(`id`="4","new_value3",`something`), `smth2` = IF(`id`="4", "nv3",`smth2`),
`something` = IF(`id`="6","new_value4",`something`), `smth2` = IF(`id`="6", "nv4",`smth2`),
`something` = IF(`id`="3","new_value5",`something`), `smth2` = IF(`id`="3", "nv5",`smth2`),
`something` = IF(`id`="5","new_value6",`something`), `smth2` = IF(`id`="5", "nv6",`smth2`) 

방금 php 같은 건물 안에서 //

$q = 'UPDATE `your_table` SET ';

foreach($data as $dat){

  $q .= '

       `something` = IF(`id`="'.$dat->id.'","'.$dat->value.'",`something`), 
       `smth2` = IF(`id`="'.$dat->id.'", "'.$dat->value2.'",`smth2`),';

}

$q = substr($q,0,-1);

업데이트할 수 있도록 구멍을 통해 쿼리하지 한 표

해설 (2)