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://: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.
廣告