복붙노트

[SQL] 어떻게 MySQL의에서 자동 증가 필드와 동일한 테이블의 행과 삽입을 복사하려면?

SQL

어떻게 MySQL의에서 자동 증가 필드와 동일한 테이블의 행과 삽입을 복사하려면?

MySQL 그럼 I는 자동 증가 컬럼 ID = 1 행을 복사 열 ID = 2를 가진 새로운 행과 동일한 테이블로 데이터를 삽입하는 것을 시도하고있다.

어떻게 하나의 쿼리에서이 작업을 수행 할 수 있습니다?

해결법

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

    1.사용 INSERT ... SELECT :

    사용 INSERT ... SELECT :

    insert into your_table (c1, c2, ...)
    select c1, c2, ...
    from your_table
    where id = 1
    

    여기서, C1, C2, ... 아이디를 제외한 모든 열이 있습니다. 명시 적 2의 ID로 삽입하려면 다음을 포함하여 INSERT 열 목록과 SELECT에서 해당 :

    insert into your_table (id, c1, c2, ...)
    select 2, c1, c2, ...
    from your_table
    where id = 1
    

    당신은 물론 두 번째 경우에 2의 가능한 중복 ID 알아서해야합니다.

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

    2.IMO, 최고의 동시에 단지 당신이해야 열을 참조하고 변경하려는 동안 만 해당 행을 복사하는 SQL 문을 사용하는 것 같다.

    IMO, 최고의 동시에 단지 당신이해야 열을 참조하고 변경하려는 동안 만 해당 행을 복사하는 SQL 문을 사용하는 것 같다.

    CREATE TEMPORARY TABLE temp_table ENGINE=MEMORY
    
    SELECT * FROM your_table WHERE id=1;
    UPDATE temp_table SET id=NULL; /* Update other values at will. */
    
    INSERT INTO your_table SELECT * FROM temp_table;
    DROP TABLE temp_table;
    

    어떻게 SQL 기록을 복제하는 - 또한 av8n.com보기

    혜택:

  3. ==============================

    3.말 테이블은 사용자 (아이디, USER_NAME, USER_EMAIL)입니다.

    말 테이블은 사용자 (아이디, USER_NAME, USER_EMAIL)입니다.

    이 쿼리를 사용할 수 있습니다 :

    INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)
    
  4. ==============================

    4.이것은 도움과는 BLOB / TEXT 컬럼을 지원합니다.

    이것은 도움과는 BLOB / TEXT 컬럼을 지원합니다.

    CREATE TEMPORARY TABLE temp_table
    AS
    SELECT * FROM source_table WHERE id=2;
    UPDATE temp_table SET id=NULL WHERE id=2;
    INSERT INTO source_table SELECT * FROM temp_table;
    DROP TEMPORARY TABLE temp_table;
    USE source_table;
    
  5. ==============================

    5.여기에 설명 된대로 열 이름을 필요로하지 않는 신속하고 깨끗한 솔루션의 경우, 준비된 문을 사용할 수 있습니다 : https://stackoverflow.com/a/23964285/292677

    여기에 설명 된대로 열 이름을 필요로하지 않는 신속하고 깨끗한 솔루션의 경우, 준비된 문을 사용할 수 있습니다 : https://stackoverflow.com/a/23964285/292677

    자주이 작업을 수행 할 수 있도록 복잡한 솔루션을 필요로하는 경우이 절차를 사용할 수 있습니다 :

    DELIMITER $$
    
    CREATE PROCEDURE `duplicateRows`(_schemaName text, _tableName text, _whereClause text, _omitColumns text)
    SQL SECURITY INVOKER
    BEGIN
      SELECT IF(TRIM(_omitColumns) <> '', CONCAT('id', ',', TRIM(_omitColumns)), 'id') INTO @omitColumns;
    
      SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.columns 
      WHERE table_schema = _schemaName AND table_name = _tableName AND FIND_IN_SET(COLUMN_NAME,@omitColumns) = 0 ORDER BY ORDINAL_POSITION INTO @columns;
    
      SET @sql = CONCAT('INSERT INTO ', _tableName, '(', @columns, ')',
      'SELECT ', @columns, 
      ' FROM ', _schemaName, '.', _tableName, ' ',  _whereClause);
    
      PREPARE stmt1 FROM @sql;
      EXECUTE stmt1;
    END
    

    당신은 그것을 실행할 수 있습니다 :

    CALL duplicateRows('database', 'table', 'WHERE condition = optional', 'omit_columns_optional');
    

    duplicateRows('acl', 'users', 'WHERE id = 200'); -- will duplicate the row for the user with id 200
    duplicateRows('acl', 'users', 'WHERE id = 200', 'created_ts'); -- same as above but will not copy the created_ts column value    
    duplicateRows('acl', 'users', 'WHERE id = 200', 'created_ts,updated_ts'); -- same as above but also omits the updated_ts column
    duplicateRows('acl', 'users'); -- will duplicate all records in the table
    

    면책 조항 :이 솔루션은 종종 여러 테이블에서 반복적으로 중복 행이 될 것이다 사람만을위한 것입니다. 그것은 악의적 인 사용자의 손에 위험 할 수 있습니다.

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

    6.레코드가 생성 될 때 당신은 또한, 올바른 값이 사용되는 자동 증가에 컬럼의 값으로 '0'에 전달할 수 있습니다. 이것은 너무 쉽게 임시 테이블보다.

    레코드가 생성 될 때 당신은 또한, 올바른 값이 사용되는 자동 증가에 컬럼의 값으로 '0'에 전달할 수 있습니다. 이것은 너무 쉽게 임시 테이블보다.

    출처: MySQL의 행을 복사 (로어 의해, 제 용액에 의해 삼각, 제 주석 참조)

  7. ==============================

    7.

    insert into MyTable(field1, field2, id_backup)
        select field1, field2, uniqueId from MyTable where uniqueId = @Id;
    
  8. ==============================

    8.여기에 큰 응답을 많이합니다. 아래는 내가 웹 응용 프로그램 내가 개발하고 있음에 대해이 작업을 수행하는 데 쓴 저장 프로 시저의 예입니다 :

    여기에 큰 응답을 많이합니다. 아래는 내가 웹 응용 프로그램 내가 개발하고 있음에 대해이 작업을 수행하는 데 쓴 저장 프로 시저의 예입니다 :

    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON
    
    -- Create Temporary Table
    SELECT * INTO #tempTable FROM <YourTable> WHERE Id = Id
    
    --To trigger the auto increment
    UPDATE #tempTable SET Id = NULL 
    
    --Update new data row in #tempTable here!
    
    --Insert duplicate row with modified data back into your table
    INSERT INTO <YourTable> SELECT * FROM #tempTable
    
    -- Drop Temporary Table
    DROP TABLE #tempTable
    
  9. ==============================

    9.당신이 경우있는 거 MySQL의 워크 벤치를 사용할 수, 당신은이 작업을 수행 할 수 있습니다 행과 선택 '복사 행'을 클릭 오른쪽, 다음, 다음 빈 행과 선택 '행을 붙여 넣기'를 마우스 오른쪽 단추로 클릭 한 다음 ID를 변경하고, 클릭 '적용'.

    당신이 경우있는 거 MySQL의 워크 벤치를 사용할 수, 당신은이 작업을 수행 할 수 있습니다 행과 선택 '복사 행'을 클릭 오른쪽, 다음, 다음 빈 행과 선택 '행을 붙여 넣기'를 마우스 오른쪽 단추로 클릭 한 다음 ID를 변경하고, 클릭 '적용'.

    행을 복사합니다 :

    빈 행에 복사 된 행을 붙여 넣습니다 :

    ID를 변경 :

    대다:

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

    10.나는 같은 기능을 찾고 있었다 그러나 나는 MySQL을 사용하지 않습니다. 나는 물론 기본 키 (ID)의 제외한 모든 필드를 복사하고 싶었다. 이되지 않은 스크립트 나 코드에서 사용할 수있는 한방 쿼리이었다.

    나는 같은 기능을 찾고 있었다 그러나 나는 MySQL을 사용하지 않습니다. 나는 물론 기본 키 (ID)의 제외한 모든 필드를 복사하고 싶었다. 이되지 않은 스크립트 나 코드에서 사용할 수있는 한방 쿼리이었다.

    나는 PL / SQL과 주위에 내 길을 찾았지만 나는 확실히 다른 SQL IDE 할 것입니다. 나는 기본을했다

    SELECT * 
    FROM mytable 
    WHERE id=42;
    

    내가 찾을 수있는 곳 그런 다음 SQL 파일로 내보내기

    INSERT INTO table (col1, col2, col3, ... , col42) 
    VALUES (1, 2, 3, ..., 42);
    

    난 그냥 그것을 편집하고 그것을 사용 :

    INSERT INTO table (col1, col2, col3, ... , col42) 
    VALUES (mysequence.nextval, 2, 3, ..., 42);
    
  11. ==============================

    11.나는 뮤 너무 짧은 게시 무엇의 변형을 사용하는 경향이 :

    나는 뮤 너무 짧은 게시 무엇의 변형을 사용하는 경향이 :

    INSERT INTO something_log
    SELECT NULL, s.*
    FROM something AS s
    WHERE s.id = 1;
    

    한 테이블이 (로그 테이블에 자동 증가를 제외하고) 동일한 필드를 가지고, 다음이 잘 작동합니다.

    나는 (데이터베이스 너무 익숙하지 않은 다른 프로그래머에 쉽게 생활에) 가능하면 저장 프로 시저를 사용하기 때문에,이 해결할 수있는 문제마다 다시 갈 필요 및 업데이트 절차의 문제는 테이블에 새 필드를 추가 할 수 있습니다.

    또한 보장 당신이 즉시 데이터베이스 쿼리를 업데이트 할 필요없이 그들이 로그 테이블에 나타나는 시작 테이블에 새 필드를 추가하는 경우 (물론 명시 적으로 필드를 설정 일부를 제외하고)

    경고 : 당신은 필드 순서 투숙 같은 ... 그렇지 않으면 당신은 이상한 버그를 받기 시작 수 있도록 동시에 두 테이블에 새로운 필드를 추가 할 수 있는지 확인하는 것이 좋습니다. 당신은 데이터베이스 인터페이스를 쓰는 유일한 사람이며, 당신은 매우 조심 다음이 잘 작동합니다. 그렇지 않으면 모든 필드를 이름에 충실.

    참고 : 당신은 당신이하는 솔로 프로젝트에 참여하지 않는 제 생각에, 반드시 그 작업을 다른 사람이 당신의 스키마 변경으로 로그 문을 명시 적으로 모든 필드 이름을 나열에 충실하고 업데이트 할 필요가 없습니다. 이 바로 가기는 아마 특히 생산 시스템에 ... 장기적으로 두통이 발생할 수 있습니다 가치가 없다.

  12. ==============================

    12.

    INSERT INTO `dbMyDataBase`.`tblMyTable` 
    (
        `IdAutoincrement`, 
        `Column2`, 
        `Column3`, 
        `Column4` 
    ) 
    
    SELECT 
        NULL,  
        `Column2`, 
        `Column3`, 
        'CustomValue' AS Column4 
    FROM `dbMyDataBase`.`tblMyTable` 
    WHERE `tblMyTable`.`Column2` = 'UniqueValueOfTheKey' 
    ; 
    /* mySQL 5.6 */
    
  13. ==============================

    13.SQL에 원하는 행을 덤프 한 다음 다시 그것을 가져 생성 된 SQL, 적은 ID 열을 사용합니다.

    SQL에 원하는 행을 덤프 한 다음 다시 그것을 가져 생성 된 SQL, 적은 ID 열을 사용합니다.

  14. from https://stackoverflow.com/questions/9156340/how-to-copy-a-row-and-insert-in-same-table-with-a-autoincrement-field-in-mysql by cc-by-sa and MIT license