create table like、create table select、insert into select的区别对比。sql(mysql、oracle等)复制表结构、表数据、索引。
1.结论
1.1.语法
-- 1.创建表不复制数据(含表结构和索引、自增等约束)。不支持oracle。
create table {table_new} like {table_old};
-- 2.不建表只复制数据(数据来自select。select很灵活,可以select任意字段,可以连表)
insert into {table_new} select * from {table_old};
-- 3.创建表并复制数据(表结构来自select,所以不含索引等约束。select很灵活,可以select任意字段,可以连表)
create table {table_new} select * from {table_old};
1.2.区别
create的两种方式均不会复制权限对表的设置。比如说原本对表old做了权限设置,复制后,表new不具备类似于表old的权限。
1.2.1.create table like
- 创建表不复制数据(含表结构和索引、自增等约束)。
- 不支持oracle。
1.2.2.insert into select
- 不建表只复制数据(数据来自select。select很灵活,可以select字段,可以连表)。
- 需提前创建好表。
1.2.3.create table as select
- 创建表并复制数据(表结构来自select,所以不含索引等约束。select很灵活,可以select字段,可以连表)。
- as可以省略
2.实例测试
2.1.创建测试表和数据
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`
(
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`name1` varchar(100) DEFAULT NULL COMMENT '姓名,无约束',
`name2` varchar(100) NOT NULL DEFAULT '' COMMENT '姓名。有索引、not null约束',
PRIMARY KEY (`id`),
KEY `bigint2` (`name1`)
);
-- 插入2条数据
INSERT INTO `user` (`id`, `name1`, `name2`) VALUES (1, '张三', '张三'),(2, '李四', '李四');
2.2.执行建表sql语句
create table user_like like user;
create table user_select select * from user;
2.3.与原表对比
- 表user_like与user表结构完全一致。
- 表user_select与user对比,丢失主键、主键自增、索引等约束。