MySQL : 행을 복사하는 방법은 있지만 몇 가지 필드를 변경하는 방법은 무엇입니까?


195

복사하려는 행이 많지만 한 필드를 변경해야합니다.

복사하려는 행을 선택할 수 있습니다.

select * from Table where Event_ID = "120"

지금은 모든 행을 복사를 설정하는 동안 새 행을 만들 Event_ID155. 어떻게하면됩니까?

답변:


279
INSERT INTO Table
          ( Event_ID
          , col2
           ...
          )
     SELECT "155"
          , col2
           ...
      FROM Table WHERE Event_ID = "120"

여기서 col2, ...는 테이블의 나머지 열 ( Event_ID 이외의 열)을 나타냅니다 .


39
열 이름을 지정하지 않고 할 수있는 방법이 있습니까?
앤드류

4
내가 아는 것은 아닙니다. 물론 테이블에 1000 개의 열이나 비슷한 것이 있고 모두 입력하지 않으려는 경우 SQL 문을 작성하여 SQL 문을 작성할 수 있습니다. :). 그렇게하는 방법은 information_schema를 사용하여 테이블의 열 이름을 얻는 것입니다. 그러나 그것은 너무 과잉입니다. 열 이름을 입력하면됩니다.
dcp

3
별표를 사용하여 나머지 열을 가져올 수 있습니까?
피터

2
내가 이미 upvoted 한 것을 알기 위해 upvote에 로그인했습니다. 나는 이것이 여러 번 나를 구했다고 생각한다 :) 감사합니다!
aexl

2
@Bitterblue-죄송합니다. 귀하의 의견을 이해하지 못합니다. 나는 col2를 말한 적이 없다. ... 복사하고 싶지 않은 열이었다. 나는 그것들이 테이블의 나머지 열을 나타낸다고 말했다. 그것들이 복사 될 것임이 명백하다. 그렇지 않으면, 그들은 SQL 문에 전혀 없을 것이다.
dcp

140

이것은 테이블에 많은 필드가 있고 모든 필드를 입력하여 손가락 경련을 원하지 않고 필요한 필드를 입력하는 솔루션입니다. :)

일부 필드의 값이 다른 일부 행을 동일한 테이블에 복사하는 방법 :

  1. 복사하려는 모든 행이있는 임시 테이블을 작성하십시오.
  2. 임시 테이블의 모든 행을 원하는 값으로 업데이트하십시오.
  3. 자동 증분 필드가있는 경우 임시 테이블에서 NULL로 설정해야합니다.
  4. 임시 테이블의 모든 행을 원래 테이블에 복사하십시오.
  5. 임시 테이블 삭제

귀하의 코드 :

CREATE table temporary_table AS SELECT * FROM original_table WHERE Event_ID="155";

UPDATE temporary_table SET Event_ID="120";

UPDATE temporary_table SET ID=NULL

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

일반적인 시나리오 코드 :

CREATE table temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

UPDATE temporary_table SET <auto_inc_field>=NULL;

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

단순화 / 응축 코드 :

CREATE TEMPORARY TABLE temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <auto_inc_field>=NULL, <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

INSERT INTO original_table SELECT * FROM temporary_table;

임시 테이블을 만들 때 TEMPORARY키워드가 사용 되므로 세션이 끝나면 @ ar34z가 제안한대로 키워드가 자동으로 삭제됩니다.


7
MySQL은 TEMPORARY키워드를 지원하여 임시 테이블을 만듭니다. CREATE TEMPORARY TABLE세션 (SQL 쿼리 시리즈)이 완료되면의 사용량 이 자동으로 테이블을 삭제합니다. 테이블을 삭제하지 않아도되며 동일한 이름을 사용하는 다른 임시 테이블과 충돌하지 않습니다. (예 : 라이브 해킹 (권장하지 않을 경우))
ar34z

1
이 코드는 temporary_table 대신 #temporary_table을 사용하는 경우에만 작동합니다. 아마도 MSSQL 문제입니까?
TruthOf42

16
이것은 기본적으로 완벽하게 작동했지만 원래 테이블에서 복사 된 것으로 보이는 임시 테이블의 기본 키에 대한 Not Null 제약 조건을 극복해야했습니다. 다음과 같이 업데이트 전에 임시 테이블을 변경하여이 문제를 해결했습니다. ALTER TABLE temporary_table MODIFY <auto_inc_not_null_field> INT; 그런 다음 기본 키를 Null로 업데이트하지 못했습니다.
snorris

1
PostgreSQL 9.4에서 작동하지 않습니다 Exception: null value in column <auto_inc_not_null_field> violates not-null constraint. 나는 시도했다ALTER TABLE temporary_table ALTER COLUMN <auto_inc_not_null_field> DROP NOT NULL;
n1000

1
다른 MySQL 및 MariaDB 버전으로 테스트했습니다. 나를 위해 완벽하게 작동하고 나는 허용 실제로 : 확실히 여기 자주 발생하는 대답이 버전 선호
hexerei 소프트웨어

41

테이블에 두 개의 다른 열이 있다고 가정 해 봅시다 .foo와 bar

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, "155"
  FROM Table
 WHERE Event_ID = "120"

4
열 이름을 지정하지 않고 할 수있는 방법이 있습니까?
앤드류

MySQL의에 @PeterBailey 새로운, 당신은 코드가 어떻게 작동하는지에 관해서는 도움이 되거하시기 바랍니다 수 : /
3kstc

10

테이블에 많은 열이 있고 각 열을 입력하지 않으려는 경우 임시 테이블을 사용하여 수행 할 수 있습니다.

SELECT *
INTO #Temp
FROM Table WHERE Event_ID = "120"
GO

UPDATE #TEMP
SET Column = "Changed"
GO

INSERT INTO Table
SELECT *
FROM #Temp

6
참고 : 이것은 테이블에 기본 키가 없다고 가정합니다.
kommradHomer

2

이봐, 모든 필드를 복사하는 방법 중 하나를 같은 값 + 다른 것으로 변경하십시오.

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, Event_ID+"155"
  FROM Table
 WHERE Event_ID = "120"

??????????


0

Event_ID가 정수인 경우 다음을 수행하십시오.

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, (Event_ID + 155)
  FROM Table
WHERE Event_ID = "120"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.