CREATE TABLE … LIKE

CREATE TABLE … LIKE 根据另一个表的定义创建一个空表,它会复制原始表的结构,但不会复制原始表中存储的数据。

语法说明

CREATE TABLE ... LIKE 根据另一个表的定义创建一个空表,它会复制原始表的结构,但不会复制原始表中存储的数据。

语法结构

CREATE TABLE [IF NOT EXISTS] new_tbl LIKE orig_tbl;

可选的 IF NOT EXISTS 子句使操作幂等:如果目标表已存在,语句静默跳过,而不是抛出 ERROR 1050。这同时适用于普通表和 TEMPORARY 表。副本继承源表的完整结构(列、类型、默认值、键、索引、外键),但不包含数据。

示例

基本 LIKE

create table test1 (a int primary key, b varchar(5) unique key);
create table test2 (a int primary key,b varchar(5) unique key,c double DEFAULT 0, d char,e int, foreign key(e) references foreign01(a), unique index(c,d));
insert into test1 values (101,'abc'),(102,'def');
insert into test2 values (1,'zs1',1,'a',101),(2,'zs2',2,'b',102);

mysql> create table test3 like test2;
Query OK, 0 rows affected (0.02 sec)

mysql> show CREATE TABLE test2;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                            |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test2 | CREATE TABLE `test2` (
`a` INT NOT NULL,
`b` VARCHAR(5) DEFAULT NULL,
`c` DOUBLE DEFAULT 0,
`d` CHAR(1) DEFAULT NULL,
`e` INT DEFAULT NULL,
PRIMARY KEY (`a`),
UNIQUE KEY `b` (`b`),
UNIQUE KEY `c` (`c`,`d`),
CONSTRAINT `018eb74f-38f3-7eb4-80c1-95d9c65de706` FOREIGN KEY (`e`) REFERENCES `foreign01` (`a`) ON DELETE RESTRICT ON UPDATE RESTRICT
) |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show CREATE TABLE test3;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                            |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test3 | CREATE TABLE `test3` (
`a` INT NOT NULL,
`b` VARCHAR(5) DEFAULT null,
`c` DOUBLE DEFAULT 0,
`d` CHAR(1) DEFAULT null,
`e` INT DEFAULT null,
PRIMARY KEY (`a`),
UNIQUE KEY `b` (`b`),
UNIQUE KEY `c` (`c`,`d`),
CONSTRAINT `018eb74f-38f3-7eb4-80c1-95d9c65de706` FOREIGN KEY (`e`) REFERENCES `foreign01` (`a`) ON DELETE RESTRICT ON UPDATE RESTRICT
) |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from test2;
+------+------+------+------+------+
| a    | b    | c    | d    | e    |
+------+------+------+------+------+
|    1 | zs1  |    1 | a    |  101 |
|    2 | zs2  |    2 | b    |  102 |
+------+------+------+------+------+
2 rows in set (0.00 sec)

mysql> select * from test3;
Empty set (0.01 sec)

IF NOT EXISTS LIKE

CREATE TABLE IF NOT EXISTS ... LIKE 使复制操作幂等。如果目标表已存在,语句静默跳过;否则正常创建表。

DROP DATABASE IF EXISTS t25119;
CREATE DATABASE t25119;
USE t25119;

CREATE TABLE foo (id INT, name VARCHAR(20));
INSERT INTO foo VALUES (1,'a'),(2,'b');

-- 首次调用创建副本表
CREATE TABLE IF NOT EXISTS foo_shadow LIKE foo;
SHOW CREATE TABLE foo_shadow;

-- 重复调用为静默空操作
CREATE TABLE IF NOT EXISTS foo_shadow LIKE foo;
CREATE TABLE IF NOT EXISTS foo_shadow LIKE foo;
SHOW TABLES;

-- 副本表是独立的空表
DESC foo_shadow;
SELECT COUNT(*) FROM foo_shadow;

-- TEMPORARY + IF NOT EXISTS LIKE
CREATE TEMPORARY TABLE IF NOT EXISTS foo_tmp LIKE foo;
CREATE TEMPORARY TABLE IF NOT EXISTS foo_tmp LIKE foo;
SELECT COUNT(*) FROM foo_tmp;

DROP TABLE IF EXISTS foo_tmp;
DROP TABLE foo_shadow;
DROP TABLE foo;
DROP DATABASE t25119;