에 삽입...모든 열에 대한 세부 정보를 표시하지 않고 선택
선택한 행을 삽입하는 방법table_source
로.table_target
MySQL에서 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_menu
1079를 선택합니다.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_id
sy3_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_id
sy3_menu
id=b는 id=1079)b입니다.
언급URL : https://stackoverflow.com/questions/8297484/insert-into-select-without-detailing-all-columns
'source' 카테고리의 다른 글
매트 자동 완성 - 선택한 옵션에 액세스하는 방법은 무엇을 참조하십시오. (0) | 2023.08.22 |
---|---|
CSS3에서 div 50px를 100% 미만으로 만드는 것이 가능합니까? (0) | 2023.08.22 |
두 앱을 MariaDB Multi Master 데이터베이스에 연결합니다. (0) | 2023.08.22 |
SQL 쿼리에 대한 지원이 필요하고 오류 메시지가 표시됨 하위 쿼리가 하나 이상의 행을 반환함 (0) | 2023.08.17 |
숫자만 포함할 문자열 제약 조건을 확인합니다. (Oracle SQL) (0) | 2023.08.17 |