- MySQL 基础
- MySQL - 首页
- MySQL - 简介
- MySQL - 特性
- MySQL - 版本
- MySQL - 变量
- MySQL - 安装
- MySQL - 管理
- MySQL - PHP 语法
- MySQL - Node.js 语法
- MySQL - Java 语法
- MySQL - Python 语法
- MySQL - 连接
- MySQL - Workbench
- MySQL 数据库
- MySQL - 创建数据库
- MySQL - 删除数据库
- MySQL - 选择数据库
- MySQL - 显示数据库
- MySQL - 复制数据库
- MySQL - 数据库导出
- MySQL - 数据库导入
- MySQL - 数据库信息
- MySQL 用户
- MySQL - 创建用户
- MySQL - 删除用户
- MySQL - 显示用户
- MySQL - 修改密码
- MySQL - 授予权限
- MySQL - 显示权限
- MySQL - 收回权限
- MySQL - 锁定用户账户
- MySQL - 解锁用户账户
- MySQL 表
- MySQL - 创建表
- MySQL - 显示表
- MySQL - 修改表
- MySQL - 重命名表
- MySQL - 克隆表
- MySQL - 清空表
- MySQL - 临时表
- MySQL - 修复表
- MySQL - 描述表
- MySQL - 添加/删除列
- MySQL - 显示列
- MySQL - 重命名列
- MySQL - 表锁定
- MySQL - 删除表
- MySQL - 派生表
- MySQL 查询
- MySQL - 查询
- MySQL - 约束
- MySQL - 插入查询
- MySQL - 选择查询
- MySQL - 更新查询
- MySQL - 删除查询
- MySQL - 替换查询
- MySQL - 插入忽略
- MySQL - 插入重复键更新
- MySQL - 插入选择
- MySQL 运算符和子句
- MySQL - WHERE 子句
- MySQL - LIMIT 子句
- MySQL - DISTINCT 子句
- MySQL - ORDER BY 子句
- MySQL - GROUP BY 子句
- MySQL - HAVING 子句
- MySQL - AND 运算符
- MySQL - OR 运算符
- MySQL - LIKE 运算符
- MySQL - IN 运算符
- MySQL - ANY 运算符
- MySQL - EXISTS 运算符
- MySQL - NOT 运算符
- MySQL - 不等于运算符
- MySQL - IS NULL 运算符
- MySQL - IS NOT NULL 运算符
- MySQL - BETWEEN 运算符
- MySQL - UNION 运算符
- MySQL - UNION 与 UNION ALL
- MySQL - MINUS 运算符
- MySQL - INTERSECT 运算符
- MySQL - INTERVAL 运算符
- MySQL 连接
- MySQL - 使用连接
- MySQL - INNER JOIN
- MySQL - LEFT JOIN
- MySQL - RIGHT JOIN
- MySQL - CROSS JOIN
- MySQL - FULL JOIN
- MySQL - 自连接
- MySQL - 删除连接
- MySQL - 更新连接
- MySQL - UNION 与 JOIN
- MySQL 触发器
- MySQL - 触发器
- MySQL - 创建触发器
- MySQL - 显示触发器
- MySQL - 删除触发器
- MySQL - 插入前触发器
- MySQL - 插入后触发器
- MySQL - 更新前触发器
- MySQL - 更新后触发器
- MySQL - 删除前触发器
- MySQL - 删除后触发器
- MySQL 数据类型
- MySQL - 数据类型
- MySQL - VARCHAR
- MySQL - BOOLEAN
- MySQL - ENUM
- MySQL - DECIMAL
- MySQL - INT
- MySQL - FLOAT
- MySQL - BIT
- MySQL - TINYINT
- MySQL - BLOB
- MySQL - SET
- MySQL 正则表达式
- MySQL - 正则表达式
- MySQL - RLIKE 运算符
- MySQL - NOT LIKE 运算符
- MySQL - NOT REGEXP 运算符
- MySQL - regexp_instr() 函数
- MySQL - regexp_like() 函数
- MySQL - regexp_replace() 函数
- MySQL - regexp_substr() 函数
- MySQL 函数和运算符
- MySQL - 日期和时间函数
- MySQL - 算术运算符
- MySQL - 数值函数
- MySQL - 字符串函数
- MySQL - 聚合函数
- MySQL 杂项概念
- MySQL - NULL 值
- MySQL - 事务
- MySQL - 使用序列
- MySQL - 处理重复项
- MySQL - SQL 注入
- MySQL - 子查询
- MySQL - 注释
- MySQL - 检查约束
- MySQL - 存储引擎
- MySQL - 将表导出到 CSV 文件
- MySQL - 将 CSV 文件导入到数据库
- MySQL - UUID
- MySQL - 公共表表达式
- MySQL - ON DELETE CASCADE
- MySQL - Upsert
- MySQL - 水平分区
- MySQL - 垂直分区
- MySQL - 游标
- MySQL - 存储函数
- MySQL - Signal
- MySQL - Resignal
- MySQL - 字符集
- MySQL - 校对
- MySQL - 通配符
- MySQL - 别名
- MySQL - ROLLUP
- MySQL - 今日日期
- MySQL - 字面量
- MySQL - 存储过程
- MySQL - Explain
- MySQL - JSON
- MySQL - 标准差
- MySQL - 查找重复记录
- MySQL - 删除重复记录
- MySQL - 选择随机记录
- MySQL - 显示 Processlist
- MySQL - 更改列类型
- MySQL - 重置自动递增
- MySQL - Coalesce() 函数
- MySQL 有用资源
- MySQL - 有用函数
- MySQL - 语句参考
- MySQL - 快速指南
- MySQL - 有用资源
- MySQL - 讨论
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.