MySQL - 克隆表



可能存在需要一个表的精确副本,该副本具有相同的列、属性、索引、默认值等的情况。与其花费时间使用 CREATE TABLE 语句创建现有表的完全相同版本,不如克隆该表而不干扰原始表。

SQL 中的克隆操作允许用户创建现有表的精确副本及其定义,该副本与原始表完全独立。因此,如果对克隆表进行了任何更改,则不会反映在原始表中。此操作在测试过程中非常有用,在测试过程中需要使用现有的数据库表执行示例测试。

使用 MySQL RDBMS 中的 SQL 可以进行三种类型的克隆;它们列在下面 -

  • 简单克隆:创建一个新表,其中包含现有表的相同记录,但不包含任何约束或索引等。

  • 浅克隆:创建一个新空表,该表与现有表的表定义相同。

  • 深克隆:创建一个新表,并将现有表的表结构和数据复制到新表。

在 MySQL 中克隆表

您可以按照以下步骤处理这种情况 -

  • 使用 SHOW CREATE TABLE 获取指定源表结构、索引和所有内容的 CREATE TABLE 语句。

  • 修改该语句以将表名更改为克隆表的表名,并执行该语句。这样,您将拥有精确的克隆表。

  • 可选地,如果您还需要复制表内容,则也发出 INSERT INTO ... SELECT 语句。

示例

尝试以下示例为CUSTOMERS创建克隆表。

步骤 1 - 首先,使用 CREATE TABLE 语句创建 CUSTOMERS。

CREATE TABLE CUSTOMERS (
   ID INT AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

使用以下 INSERT INTO 语句将一些记录插入其中。

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES 
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

现在,执行以下 SHOW CREATE TABLE 命令以显示源表 (CUSTOMERS) 的结构。

SHOW CREATE TABLE CUSTOMERS;

以下是 CUSTOMERS 表的结构。

Table: CUSTOMERS
Create Table: CREATE TABLE `customers` (
  `ID` int NOT NULL AUTO_INCREMENT,
  `NAME` varchar(20) NOT NULL,
  `AGE` int NOT NULL,
  `ADDRESS` char(25) DEFAULT NULL,
  `SALARY` decimal(18,2) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

步骤 2 - 现在,复制上述源表结构,只需将名称更改为copyCUSTOMERS

CREATE TABLE `copyCUSTOMERS` (
  `ID` int NOT NULL AUTO_INCREMENT,
  `NAME` varchar(20) NOT NULL,
  `AGE` int NOT NULL,
  `ADDRESS` char(25) DEFAULT NULL,
  `SALARY` decimal(18,2) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

步骤 3 - 执行步骤 2 后,如果我们想从源表复制数据,则可以使用 INSERT INTO... SELECT 语句。

INSERT INTO copyCUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
   
SELECT ID,NAME,AGE,ADDRESS,SALARY FROM CUSTOMERS;

让我们使用以下查询验证克隆表 copyCUSTOMERS 是否与 CUSTOMERS 表具有相同的记录 -

SELECT * FROM copyCUSTOMERS;

正如我们观察到的输出,我们有一个与 CUSTOMERS 完全相同的克隆表。

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

但是为了简化此过程,我们可以尝试使用 CREATE TABLE 和 INSERT INTO 语句执行简单克隆、浅克隆或深克隆。让我们在本教程的后面详细讨论它们,并提供相应的示例。

在 MySQL 中进行简单克隆

简单克隆意味着创建一个新表,该表包含与现有表相同的数据。首先,使用 CREATE TABLE 语句创建一个新表。然后,使用 SELECT 语句将现有表中选定列的数据复制到新表中。

语法

以下是执行 MySQL RDBMS 中简单克隆的基本语法 -

CREATE TABLE new_table SELECT * FROM original_table;

示例

要执行简单克隆操作,让我们首先使用以下查询创建一个名为CUSTOMERS的表 -

CREATE TABLE CUSTOMERS (
   ID INT AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

以下查询将 7 条记录插入到上面创建的表中 -

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES 
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

要显示上面创建的表的记录,请执行以下查询 -

SELECT * FROM CUSTOMERS;

以下是 CUSTOMERS 表 -

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

现在,使用以下查询,我们将通过**克隆**CUSTOMERS表创建一个名为**CUSTOMERScopy**的新表。

CREATE TABLE CUSTOMERScopy SELECT * FROM CUSTOMERS;

输出

执行上面的查询将产生以下输出:

Query OK, 7 rows affected (0.02 sec)
Records: 7  Duplicates: 0  Warnings: 0

验证

为了验证新表是否包含现有表CUSTOMERS中的所有信息,我们可以使用以下SELECT查询:

SELECT * FROM CUSTOMERScopy;

以下是CUSTOMERScopy表:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

在 MySQL 中进行浅克隆

浅克隆操作仅将现有表的结构复制到新创建的表中,但不会复制任何数据。因此,我们最终得到一个新的空表,其结构与现有表相同。

语法

以下是MySQL RDBMS中执行浅克隆的基本语法:

CREATE TABLE testCUSTOMERS1 LIKE CUSTOMERS;

示例

在以下查询中,我们通过创建一个名为**CUSTOMERScopy1**的新表来克隆CUSTOMERS表,从而执行浅克隆。

CREATE TABLE CUSTOMERScopy1 LIKE CUSTOMERS;

输出

执行上面的查询将产生以下输出:

Query OK, 0 rows affected (0.03 sec)

验证

为了验证新表是否已创建,我们可以使用以下SELECT查询:

SELECT * FROM CUSTOMERScopy1;

如输出所示,新表CUSTOMERScopy1已创建,但没有复制任何数据到其中。

Empty set (0.00 sec)

在 MySQL 中进行深克隆

深克隆操作是简单克隆和浅克隆的组合。它不仅复制现有表的结构,还将数据复制到新创建的表中。因此,新表将具有现有表的所有属性及其内容。

由于它是浅克隆和简单克隆的组合,因此此类型的克隆将有两个不同的查询需要执行:一个使用CREATE TABLE语句,另一个使用INSERT INTO语句。CREATE TABLE语句将创建新表,包括现有表的所有属性;INSERT INTO语句将现有表中的数据插入到新表中。

语法

以下是MySQL RDBMS中执行深克隆的基本语法:

CREATE TABLE new_table LIKE original_table;
INSERT INTO new_table SELECT * FROM original_table;

示例

在以下查询中,我们通过克隆CUSTOMERS表创建一个名为**CUSTOMERScopy2**的新表,即首先执行**浅克隆**。

CREATE TABLE CUSTOMERScopy2 LIKE CUSTOMERS;

现在,使用以下查询,我们将CUSTOMERS表中的数据插入到新表CUSTOMERScopy2中,即执行**简单克隆**。

INSERT INTO CUSTOMERScopy2 SELECT * FROM CUSTOMERS;

输出

执行上面的查询将产生以下输出:

Query OK, 7 rows affected (0.01 sec)
Records: 7  Duplicates: 0  Warnings: 0

验证

为了验证新表是否已创建,以及其中是否存在所有数据,我们可以使用以下SELECT查询:

SELECT * FROM CUSTOMERScopy2;

正如我们观察到的输出,CUSTOMERScopy2表与CUSTOMERS表具有相同的结构和数据。

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

使用客户端程序克隆表

除了使用MySQL查询克隆现有表之外,还可以使用客户端程序对表执行克隆操作。

语法

以下是各种编程语言中克隆表的语法:

要通过PHP程序将表克隆到MySQL数据库中,我们需要使用**mysqli**函数**query()**执行以下语句:

$sql = "CREATE TABLE clone_table LIKE tut_tbl";
$mysqli->query($sql);

要通过Node.js程序将表克隆到MySQL数据库中,我们需要使用**mysql2**库的**query()**函数执行以下语句:

sql = "CREATE TABLE new_table SELECT * FROM original_table";
con.query(sql);

要通过Java程序将表克隆到MySQL数据库中,我们需要使用**JDBC**函数**executeUpdate()**执行以下语句:

String sql = "CREATE TABLE clone_table LIKE tut_tbl";
statement.executeUpdate(sql);

要通过Python程序将表克隆到MySQL数据库中,我们需要使用MySQL**Connector/Python**的**execute()**函数执行以下语句:

sql = "CREATE TABLE new_table_name AS
   SELECT * FROM source_table_name";
cursorObj.execute(sql);

示例

以下是程序:

$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);

if ($mysqli->connect_errno) {
    printf("Connect failed: %s
", $mysqli->connect_error); exit(); } printf('Connected successfully.
'); // clone table // To inherit all table definitions, use the create table...like syntax $sql = "CREATE TABLE clone_table LIKE tut_tbl"; if ($mysqli->query($sql)) { printf("Table cloned successfully.
"); } if ($mysqli->errno) { printf("table could not be cloned: %s
", $mysqli->error); } // To copy the data, you'll need INSER...SELECT $cpy_data = "INSERT INTO clone_table SELECT * FROM tut_tbl"; if ($mysqli->query($cpy_data)) { printf("fully cloned including data.
"); } if ($mysqli->errno) { printf("table could not be cloned fully: %s
", $mysqli->error); } $mysqli->close();

输出

获得的输出如下:

Connected successfully.
Table cloned successfully.
fully cloned including data.
var mysql = require('mysql2');
var con = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "Nr5a0204@123"
});

  //Connecting to MySQL
  con.connect(function (err) {
  if (err) throw err;
  console.log("Connected!");
  console.log("--------------------------");

  sql = "CREATE DATABASE TUTORIALS;"
  con.query(sql);

  sql = "USE TUTORIALS;"
  con.query(sql);

  sql = "CREATE TABLE CUSTOMERS(ID int NOT NULL, NAME varchar(20) NOT NULL, AGE int NOT NULL, ADDRESS varchar(25), SALARY decimal(18, 2), PRIMARY KEY (ID) );"
  con.query(sql);

  sql = "INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Ramesh',32, 'Ahmedabad', 2000.00 ),(2, 'Khilan',25, 'Delhi', 1500.00 ),(3, 'kaushik',23, 'Kota', 2000.00),(4,'Chaitali', 25, 'Mumbai', 6500.00 ),(5, 'Hardik',27, 'Bhopal', 8500.00 ),(6, 'Komal',22, 'MP', 4500.00 ),(7, 'Muffy',24, 'Indore', 10000.00 );"
  con.query(sql);

  sql = "CREATE TABLE testCUSTOMERS SELECT * FROM CUSTOMERS;"
  con.query(sql);

  sql = "SELECT * FROM testCUSTOMERS;"
  con.query(sql, function(err, result){
    if (err) throw err
    console.log("**Records in Clone table**")
    console.log(result);
  });
});

输出

产生的输出如下:

Connected!
--------------------------
**Records in Clone table**
[
  {
    ID: 1,
    NAME: 'Ramesh',
    AGE: 32,
    ADDRESS: 'Ahmedabad',
    SALARY: '2000.00'
  },
  {
    ID: 2,
    NAME: 'Khilan',
    AGE: 25,
    ADDRESS: 'Delhi',
    SALARY: '1500.00'
  },
  {
    ID: 3,
    NAME: 'kaushik',
    AGE: 23,
    ADDRESS: 'Kota',
    SALARY: '2000.00'
  },
  {
    ID: 4,
    NAME: 'Chaitali',
    AGE: 25,
    ADDRESS: 'Mumbai',
    SALARY: '6500.00'
  },
  {
    ID: 5,
    NAME: 'Hardik',
    AGE: 27,
    ADDRESS: 'Bhopal',
    SALARY: '8500.00'
  },
  { ID: 6, NAME: 'Komal', AGE: 22, ADDRESS: 'MP', SALARY: '4500.00' },
  {
    ID: 7,
    NAME: 'Muffy',
    AGE: 24,
    ADDRESS: 'Indore',
    SALARY: '10000.00'
  }
]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class CloneTable {
    public static void main(String[] args){
        String url = "jdbc:mysql://127.0.0.1:3306/TUTORIALS";
        String username = "root";
        String password = "password";
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection connection = DriverManager.getConnection(url, username, password);
            Statement statement = connection.createStatement();
            System.out.println("Connected successfully...!");

            //Creates clone tables...!
            String sql = "CREATE TABLE clone_tbl LIKE customers";
            statement.executeUpdate(sql);
            System.out.println("Clone table of customers has been created successfully...!");
            
            connection.close();
        }
        catch(Exception e){
            System.out.println(e);
        }
    }
}

输出

获得的输出如下所示:

Connected successfully...!
Clone table of customers has been created successfully...!
import mysql.connector
#establishing the connection
connection = mysql.connector.connect(
    host='localhost',
    user='root',
    password='password',
    database='tut'
)
source_table_name = 'tutorials_tbl'
new_table_name = 'tutorials_tbl_cloned'
#Creating a cursor object 
cursorObj = connection.cursor()
cursorObj.execute(f"CREATE TABLE {new_table_name} AS SELECT * FROM {source_table_name}")
print(f"Table '{source_table_name}' is cloned to '{new_table_name}' successfully.")
cursorObj.close()
connection.close()

输出

以下是上述代码的输出:

Table 'tutorials_tbl' is cloned to 'tutorials_tbl_cloned' successfully.
广告