MySQL 테이블, 인덱스 및 데이터 복제
MySQL 테이블의 데이터, 구조 및 인덱스를 새 테이블로 복사 또는 복제하려면 어떻게 해야 합니까?
이게 지금까지 제가 알아낸 거예요.
이렇게 하면 데이터 및 구조가 복사되지만 인덱스는 복사되지 않습니다.
create table {new_table} select * from {old_table};
구조 및 인덱스는 복사되지만 데이터는 복사되지 않습니다.
create table {new_table} like {old_table};
인덱스 및 트리거를 사용하여 복사하려면 다음 두 가지 쿼리를 수행합니다.
CREATE TABLE new_table LIKE old_table;
INSERT INTO new_table SELECT * FROM old_table;
구조 및 데이터만 복사하려면 다음 명령을 사용합니다.
CREATE TABLE new_table AS SELECT * FROM old_table;
전에도 물어본 적 있어요
위의 솔루션과는 별도로AS
일렬로 서야 합니다.
CREATE TABLE tbl_new AS SELECT * FROM tbl_old;
MySQL 방식:
CREATE TABLE recipes_new LIKE production.recipes;
INSERT recipes_new SELECT * FROM production.recipes;
phpMyAdmin으로 이동하여 원래 테이블을 선택한 후 "Copy table to (database.table)" 영역에서 "Operations" 탭을 선택합니다.복사할 데이터베이스를 선택하고 새 테이블의 이름을 추가합니다.
나는 같은 상황을 발견했고, 내가 취한 접근법은 다음과 같다.
- 실행
SHOW CREATE TABLE <table name to clone>
: 이렇게 하면Create Table
복제할 테이블의 구문 - 를 실행합니다.
CREATE TABLE
테이블을 복제하기 위해 테이블 이름을 변경하여 쿼리를 수행합니다.
이렇게 하면 인덱스와 함께 복제할 테이블의 정확한 복제본이 만들어집니다.필요한 경우 인덱스 이름만 바꾸면 됩니다.
테이블을 복제하는 더 좋은 방법은 오직DDL
진술.이렇게 하면 테이블 내의 레코드 수에 관계없이 복제를 즉시 수행할 수 있습니다.
목적은 다음과 같습니다.
DROP TABLE IF EXISTS table_name_OLD;
CREATE TABLE table_name_NEW LIKE table_name;
RENAME TABLE table_name TO table_name_OLD;
RENAME TABLE table_name _NEW TO table_name;
이것에 의해,INSERT AS SELECT
기록이 많은 테이블의 경우 실행하는 데 시간이 걸릴 수 있습니다.
다음 예시와 같이 PLSQL 프로시저를 작성할 것을 권장합니다.
DELIMITER //
CREATE PROCEDURE backup_table(tbl_name varchar(255))
BEGIN
-- DROP TABLE IF EXISTS GLS_DEVICES_OLD;
SET @query = concat('DROP TABLE IF EXISTS ',tbl_name,'_OLD');
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- CREATE TABLE GLS_DEVICES_NEW LIKE GLS_DEVICES;
SET @query = concat('CREATE TABLE ',tbl_name,'_NEW LIKE ',tbl_name);
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- RENAME TABLE GLS_DEVICES TO GLS_DEVICES_OLD;
SET @query = concat('RENAME TABLE ',tbl_name,' TO ',tbl_name,'_OLD');
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- RENAME TABLE GLS_DEVICES_NEW TO GLS_DEVICES;
SET @query = concat('RENAME TABLE ',tbl_name,'_NEW TO ',tbl_name);
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END//
DELIMITER ;
좋은 하루 보내세요!알렉스야.
다른 데이터베이스의 데이터 없이 테이블과 해당 구조를 복제하려면 이 명령을 사용합니다.새 데이터베이스에 sql 유형
CREATE TABLE currentdatabase.tablename LIKE olddatabase.tablename
테이블을 복제하기 전에 테이블이 이미 존재하는지 확인하는 것이 중요합니다.
CREATE TABLE IF NOT EXISTS new_table LIKE old_table;
INSERT new_table
SELECT * FROM old_table;
이전 답변에서 설명한 바와 같이 구조, 데이터 및 표의 모든 종속 개체를 복사합니다.
MySql 튜토리얼 참조:
이 답변을 확장하면 저장 프로시저를 사용할 수 있습니다.
CALL duplicate_table('tableName');
그러면 테이블이 중복됩니다.tableName_20181022235959
언제 호출하면
SELECT NOW();
결과:
2018-10-22 23:59:59
실행
DELIMITER $$
CREATE PROCEDURE duplicate_table(IN tableName VARCHAR(255))
BEGIN
DECLARE schemaName VARCHAR(255) DEFAULT SCHEMA();
DECLARE today VARCHAR(14) DEFAULT REPLACE(REPLACE(REPLACE(NOW(), '-', ''), ' ', ''), ':', ''); -- update @ year 10000
DECLARE backupTableName VARCHAR(255) DEFAULT CONCAT(tableName, '_', today);
IF fn_table_exists(schemaName, tableName)
THEN
CALL statement(CONCAT('CREATE TABLE IF NOT EXISTS ', backupTableName,' LIKE ', tableName));
CALL statement(CONCAT('INSERT INTO ', backupTableName,' SELECT * FROM ', tableName));
CALL statement(CONCAT('CHECKSUM TABLE ', backupTableName,', ', tableName));
ELSE
SELECT CONCAT('ERROR: Table "', tableName, '" does not exist in the schema "', schemaName, '".') AS ErrorMessage;
END IF;
END $$
DELIMITER ;
DELIMITER $$
CREATE FUNCTION fn_table_exists(schemaName VARCHAR(255), tableName VARCHAR(255))
RETURNS TINYINT(1)
BEGIN
DECLARE totalTablesCount INT DEFAULT (
SELECT COUNT(*)
FROM information_schema.TABLES
WHERE (TABLE_SCHEMA COLLATE utf8_general_ci = schemaName COLLATE utf8_general_ci)
AND (TABLE_NAME COLLATE utf8_general_ci = tableName COLLATE utf8_general_ci)
);
RETURN IF(
totalTablesCount > 0,
TRUE,
FALSE
);
END $$
DELIMITER ;
DELIMITER $$
CREATE PROCEDURE statement(IN dynamic_statement TEXT)
BEGIN
SET @dynamic_statement := dynamic_statement;
PREPARE prepared_statement FROM @dynamic_statement;
EXECUTE prepared_statement;
DEALLOCATE PREPARE prepared_statement;
END $$
DELIMITER ;
위의 해결책을 시도해 본 후, 나는 나만의 방법을 생각해냈다.
나의 솔루션은 약간의 매뉴얼로 DBMS가 필요합니다.
먼저 데이터를 내보냅니다.
둘째, 내보내기 데이터를 엽니다.
셋째, 오래된 테이블 이름을 새 테이블 이름으로 바꿉니다.
넷째, 데이터 내의 모든 트리거 이름을 변경합니다(MySQL을 사용하고 있는데 트리거 이름을 변경하지 않으면 오류가 표시됩니다).
다섯 번째, 편집한 SQL 데이터를 데이터베이스로 가져옵니다.
테이블 구조를 작성하려면 다음 코드만 사용합니다.
CREATE TABLE new_table LIKE current_table;
테이블에서 다른 테이블로 데이터를 복사하려면 다음 코드를 사용합니다.
INSERT INTO new_table SELECT * FROM current_table;
Simple Cloning: 컬럼 속성 및 인덱스를 고려하지 않고 다른 테이블에서 테이블을 만듭니다.
CREATE TABLE new_table SELECT * FROM original_table;
얕은 복제:이렇게 하면 원래 테이블의 구조에 빈 테이블 베이스만 생성됩니다.
CREATE TABLE new_table LIKE original_table;
다음 명령어는 원래 테이블에 빈 테이블 베이스를 만듭니다.
CREATE TABLE adminUsers LIKE users;
딥 클로닝:즉, 새 테이블은 기존 테이블의 각 열과 인덱스의 모든 속성을 가집니다.이것은 기존 테이블의 인덱스와 속성을 유지하려는 경우 매우 유용합니다.
CREATE TABLE new_table LIKE original_table;
INSERT INTO new_table SELECT * FROM original_table;
https://towardsdatascience.com/how-to-clone-tables-in-sql-dd29586ec89c
// To copy specific column data use this one:
CREATE TABLE ut_axis_existrec LIKE ut_karvy_annexure; // To create new table
INSERT INTO ut_axis_existrec
(funding_ac,micr_no, warrant_no,
amount,invname,mfundcode,funding_dt,status,remarks1,amc_remark,created_at)
SELECT
t1.funding_ac,
t1.micr_no,
t1.warrant_no,
t1.amount,
t1.invname,
t1.mfund_code,
t1.funding_dt,
t1.status,
t1.remarks1,
t1.created_at
from ut_axis_karvy
inner join
ut_axis_karvy_master as t2
on t1.micr_no = t2.micr_no;
다음을 시도해 보십시오.
`CREATE TABLE new-table (id INT(11) auto_increment primary key) SELECT old-table.name, old-table.group, old-table.floor, old-table.age from old-table;`
나는 오래된 테이블에서 4개의 컬럼을 선택하여 새로운 테이블을 만들었다.
MySQL의 경우
CREATE TABLE newtable LIKE oldtable ;
INSERT newtable SELECT * FROM oldtable ;
의 경우 MSSQL을 합니다.MyDatabase
:
Select * into newCustomersTable from oldCustomersTable;
은 "SQL"로 복사됩니다.【 old Customers Table 】【Customers Table 】【Customers Table 】newCustomersTable
.
하세요.newCustomersTable
는 데이터베이스에 존재하지 않습니다.
언급URL : https://stackoverflow.com/questions/3280006/duplicating-a-mysql-table-indices-and-data
'programing' 카테고리의 다른 글
문자열을 올바른 파일 이름으로 변환하시겠습니까? (0) | 2022.10.11 |
---|---|
키로 어레이 값 가져오기 (0) | 2022.10.11 |
SELECT 실행 중...위치..."MySQLdb를 사용하여 입력..." (0) | 2022.10.11 |
HTML5에서 폴리필의 의미는 무엇입니까? (0) | 2022.10.11 |
Chart.js에서 차트의 높이를 설정합니다. (0) | 2022.10.11 |