source

에 삽입...모든 열에 대한 세부 정보를 표시하지 않고 선택

nicesource 2023. 8. 22. 22:11
반응형

에 삽입...모든 열에 대한 세부 정보를 표시하지 않고 선택

선택한 행을 삽입하는 방법table_source로.table_targetMySQL에서 SQL 사용 위치:

  • 두 테이블의 스키마가 동일합니다.
  • 자동 증분을 제외한 모든 열이 전송되어야 합니다.id
  • 모든 열 이름을 명시적으로 쓰지 않으면 지루할 수 있습니다.

사소한 것들INSERT INTO table_target SELECT * FROM table_source기본 키에 대한 중복 항목에서 실패합니다.

삽입할 모든 필드를 나열하거나...목록을 작성하기 위해 외부에서 다른 항목을 사용합니다.

SQL에는 다음과 같은 것이 없습니다.SELECT * except somefield FROM그래서 당신은 총알을 깨물고 필드 이름을 적어야 합니다.

열 이름을 지정해야 합니다.

INSERT INTO table_target SELECT NULL, column_name1, column_name2, column_name3, ...
  FROM table_source;

자동 증분 ID 필드의 값으로 NULL을 전달합니다.

물론 기본 키는 고유해야 합니다.달성하려는 항목에 따라 다르지만 이미 존재하는 기본 키가 있는 행은 제외할 수 있습니다.

INSERT INTO table_target SELECT * FROM table_source 
WHERE table_source.id NOT IN (SELECT id FROM table_target)

업데이트: 추가 행도 필요하므로 먼저 충돌을 해결해야 합니다. table_source에 관계가 있습니까?그렇지 않은 경우 이러한 키를 변경할 수 있습니다.

UPDATE table_source SET id = id + 1000
WHERE id IN (SELECT id FROM table_target)

여기서 1000은 상수이고 충분히 크기 때문에 테이블 끝을 찾습니다.

지루하지만 안전하고 정확합니다.

열 목록을 제공하지 않고 INSERT 문을 작성하면 코드를 디버깅하기가 어렵고 테이블 정의가 변경되면 코드가 깨지기 쉽습니다.

열 이름을 직접 쓸 수 없는 경우에는 쉼표로 구분된 목록을 만드는 도구를 코드에 비교적 쉽게 만들 수 있습니다.

이것이 '삽입 교체' 명령을 사용한 대량 업데이트에 대한 최종 해결책입니다.

SET @@session.group_concat_max_len = @@global.max_allowed_packet;
SET @schema_db = 'db';
SET @tabl = 'table';
SET @cols = (SELECT CONCAT('`',GROUP_CONCAT(COLUMN_NAME SEPARATOR '`, `'), '`') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @schema_db AND TABLE_NAME = @tabl GROUP BY TABLE_NAME);
SET @Querystr = CONCAT('REPLACE INTO ',@schema_db,'.',@tabl,' SELECT ', @cols,' FROM import.tbl_', @tabl);

PREPARE stmt FROM @Querystr;
EXECUTE stmt;

다음과 같은 구문을 사용할 수 있습니다.

표에 삽입(a,b,c) 값(1,2,3)중복 키 업데이트 시 c=c+1;

참조: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html 도움이 되길 바랍니다.

INSERT IGNORE중복된 행만 "삭제"할 수 있습니다.

http://dev.mysql.com/doc/refman/5.5/en/insert.html

당신은 아마도 준비된 진술서로 그것을 할 수 있을 것입니다.

PREPARE table_target_insert FROM 'INSERT INTO table_target SELECT ? FROM table_source';
SET @cols:='';
SELECT @cols:=GROUP_CONCAT(IF(column_name = 'id','NULL',column_name) separator ",") FROM information_schema.columns WHERE table_name='table_source';
EXECUTE table_target_insert USING @cols;

MySQL Prepared 문에서 열을 자리 표시자로 지정할 수 없습니다.테스트를 위해 다음 솔루션을 컴파일했습니다.

SET @schema_db = 'DB';
SET @table = 'table';
SET @cols = (SELECT CONCAT(GROUP_CONCAT(COLUMN_NAME SEPARATOR ', '), "\n") FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @schema_db AND TABLE_NAME = @table GROUP BY TABLE_NAME);
SET @Querystr = CONCAT('SELECT',' ', @cols,' ','FROM',' ',@schema_db,'.',@table,' ', 'Limit 5');
PREPARE stmt FROM @Querystr;
EXECUTE stmt;

동적 쿼리를 사용할 수 있습니다.

DECLARE @Columns VARCHAR(MAX)=''
DECLARE @Query VARCHAR(MAX)=''

SELECT 
       @Columns = ISNULL(@Columns +',', '') + T.COLUMN_NAME
FROM 
( 
    select name as COLUMN_NAME from sys.all_columns
    where object_id = (select object_id from sys.tables where name = 'Source_Table')
    and is_identity = 0
)T


set @Query = 'insert into Target_Table (' + SUBSTRING(@Columns,2 , 9999) + ') select ' + SUBSTRING(@Columns,2 , 9999) + ' from Source_Table';

PRINT @Query
EXEC(@Query)

가장 쉬운 방법은 phpmyadmin을 사용하여 열 목록을 작성한 다음 필요에 따라 변경하는 것입니다. 아래 예제에서는 ID=1078의 행을 복제하고 이 표에서는 고유한 자동 증분 및 별칭을 사용합니다.따라서 ID와 별칭을 원하는 값으로 대체하여 다음과 같이 쿼리를 만들었습니다.그리고 그것은 매력적으로 작용했습니다.

에 삽입sy3_menu1079를 선택합니다.menutype,title, "alias",note,path,link,type,published,parent_id,level,component_id,checked_out,checked_out_time,browserNav,access,img,template_style_id,params,lft,rgt,home,language,client_idsy3_menu서 ID은 ID=1078입니다.

으로 증가시키려면 : INTO "ID" 를 합니다.sy3_menu선택 MAX)(선택 MAX())id에서 +1)로 이동합니다.sy3_menu)menutype,title, "alias",note,path,link,type,published,parent_id,level,component_id,checked_out,checked_out_time,browserNav,access,img,template_style_id,params,lft,rgt,home,language,client_idsy3_menuid=b는 id=1079)b입니다.

언급URL : https://stackoverflow.com/questions/8297484/insert-into-select-without-detailing-all-columns

반응형