`
wangshaofei
  • 浏览: 282349 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

测试create table a as select * from b 与create table a like b的区别

阅读更多

目的:测试create table a as select * from b 与create table a  like b的区别

mysql 下测试:

源表:ti

表结构如下

root:test> show create table ti\G
*************************** 1. row ***************************
       Table: ti
Create Table: CREATE TABLE `ti` (
  `id` int(11) DEFAULT NULL,
  `amount` decimal(7,2) DEFAULT NULL,
  `m_photo_big` varchar(64) DEFAULT NULL,
  `tr_date` date DEFAULT NULL,
  `new_msg_flag` tinyint(4) NOT NULL DEFAULT '0',
  `love_listreq` int(3) DEFAULT '1',
  `love_listconfig` int(3) DEFAULT '1',
  KEY `new_msg_flag` (`new_msg_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

a 使用create as select语句创建表

root:test> create table ti2 as select * from ti limit 0;
Query OK, 0 rows affected (0.00 sec)

sroot:test> how create table ti2 ;
----------------------------
CREATE TABLE `ti2` (
  `id` int(11) DEFAULT NULL,
  `amount` decimal(7,2) DEFAULT NULL,
  `m_photo_big` varchar(64) DEFAULT NULL,
  `tr_date` date DEFAULT NULL,
  `new_msg_flag` tinyint(4) NOT NULL DEFAULT '0',
  `love_listreq` int(3) DEFAULT '1',
  `love_listconfig` int(3) DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

对比源表的表结构,发现KEY `new_msg_flag` (`new_msg_flag`)没有被创建


b 使用like子句创建表

root:test> create table ti1 like ti;
Query OK, 0 rows affected (0.06 sec)

root:test> show create table ti1;  
----------------------------------------
CREATE TABLE `ti1` (
  `id` int(11) DEFAULT NULL,
  `amount` decimal(7,2) DEFAULT NULL,
  `m_photo_big` varchar(64) DEFAULT NULL,
  `tr_date` date DEFAULT NULL,
  `new_msg_flag` tinyint(4) NOT NULL DEFAULT '0',
  `love_listreq` int(3) DEFAULT '1',
  `love_listconfig` int(3) DEFAULT '1',
  KEY `new_msg_flag` (`new_msg_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

对比源表的表结构,两者完全一致,完整的包含了表结构和索引

结论:mysql下create table a as select * from b形式创建的表不包含索引信息,like子句形式包含完整表结构和索引信息

所以 as select 子句一般适用于建表并复制源表数据的情况,like子句适用于只复制表结构的情况

误用的风险: 索引的缺失对于业务的性能是致命的,不必多说.

Oracle 下:

a create as select同样不会创建索引

b oracle不支持like子句

 

权限不会随like一起复制

原表 test.test

原表table级别权限:

root:mysql> select * from tables_priv where Db='test' and Table_name='test';
+-------------+------+-------+------------+----------------+---------------------+-----------------------------+-------------+
| Host        | Db   | User  | Table_name | Grantor        | Timestamp           | Table_priv                  | Column_priv |
+-------------+------+-------+------------+----------------+---------------------+-----------------------------+-------------+
| 192.168.%.% | test | root  | test       | root@localhost | 2009-09-17 11:22:25 | Select,Insert,Update,Delete |             | 
| 192.168.%.% | test | lidan | test       | root@localhost | 2009-09-17 11:23:58 | Select,Insert,Update,Delete |             | 
+-------------+------+-------+------------+----------------+---------------------+-----------------------------+-------------+
2 rows in set (0.00 sec)

复制表:

root:test> create table pri_test like test;
Query OK, 0 rows affected (0.00 sec)

pri_test的权限
root:mysql> select * from tables_priv where Db='test' and Table_name='pri_test';
Empty set (0.00 sec)

可见使用like不可能保持原表和复制表的权限一致



至于如何实现完全创建表结构和索引的方法有待继续探讨!

分享到:
评论

相关推荐

    MySQL中表复制:create table like 与 create table as select

    CREATE TABLE A AS SELECT x, x, x, xx FROM B LIMIT 0; ``` 在这个例子中,表A将只包含从B表中选择的x和xx字段,而不包含B表的其他字段。由于使用了`LIMIT 0`,所以不会复制任何数据。这种方法适合在保留源表...

    MySQL中create table as 与like的区别分析

    本文分析了MySQL中create table as 与like的区别。分享给大家供大家参考,具体如下: 对于mysql的复制相同表结构方法,有create table as 和create table like 两种,区别是什么呢? 代码如下:create table t2 as ...

    sql用法大全,包含sql多种基本用法

    - 示例: `SELECT a.title, a.username, b.addddate FROM tablea, (SELECT MAX(adddate) adddate FROM table WHERE table.title = a.title) AS b;` 以上是SQL的一些基础与进阶用法,掌握这些知识点能够帮助你在实际...

    sql 总结

    * 查找:SELECT * FROM table1 WHERE field1 LIKE '%value1%' * 排序:SELECT * FROM table1 ORDER BY field1, field2 [DESC] * 总数:SELECT COUNT(*) AS totalcount FROM table1 * 求和:SELECT SUM(field1) AS ...

    spl基本命令

    - **示例**: `SELECT a.*, b.* FROM table_a a RIGHT OUTER JOIN table_b b ON a.key = b.key;` 3. **全外连接 (FULL OUTER JOIN)** - 包括左表和右表中的所有行, 无论是否有匹配。 - **示例**: `SELECT a.*, b....

    数据库经典语句,优化SQL语句大全

    CREATE TABLE tab_new AS SELECT col1, col2... FROM tab_old; ``` `ALTER TABLE` 语句用于修改表结构,如添加列、删除列或更改列属性。添加主键使用 `ADD PRIMARY KEY`,删除主键用 `DROP PRIMARY KEY`。例如: ```...

    常用实用的sql语句

    - **模糊查询**:`SELECT * FROM table_name WHERE field LIKE '%value%';` - **排序查询**:`SELECT * FROM table_name ORDER BY field ASC|DESC;` #### 插入数据 - **基本插入**:`INSERT INTO table_name (field...

    Oracle学习

    SELECT * FROM table_a RIGHT OUTER JOIN table_b ON table_a.id = table_b.id; ``` - **全外连接**(Full Outer Join) - **功能**:返回左表和右表中的所有行,无论是否匹配;对于未匹配的行,另一侧使用NULL...

    经典SQL语句大全,全面,有例子

    CREATE TABLE new_table AS SELECT * FROM old_table; ``` 6. **删除表**:`DROP TABLE`语句用于删除整个表,例如`DROP TABLE tablename`。 7. **增加列**:`ALTER TABLE`语句用于在表中添加新列,如`ALTER ...

    sql的基本语法格式大全

    - **SQL语句**: `SELECT a.a, a.b, a.c, b.c, b.d, b.f FROM a LEFT OUTER JOIN b ON a.key = b.key;` - **说明**: 返回左表的所有记录和右表中符合条件的记录,如果右表中没有匹配,则结果集中相应的列为空。 - **...

    SQL语句大全

    CREATE TABLE tab_new AS SELECT col1, col2 FROM tab_old DEFINITION ONLY ``` - **删除表**: `DROP TABLE tabname`。这条命令用于删除指定的表。 - **修改表结构**: - **增加列**: ```sql ALTER TABLE ...

    sql精妙语句 学习手册

    - **示例**: `SELECT a.a, a.b, a.c, b.c, b.d, b.f FROM a LEFT OUTER JOIN b ON a.a = b.c;` - **右外连接**: - **语法**: `SELECT * FROM table1 RIGHT OUTER JOIN table2 ON table1.column = table2.column;`...

    SQL语法\数据库

    - **AS SELECT 语法**: `CREATE TABLE tab_new AS SELECT col1, col2 FROM tab_old DEFINITION ONLY;` - 只复制表结构不包含数据。 **3. 删除表 (DROP TABLE)** - **语法**: `DROP TABLE tabname;` - 删除指定表...

Global site tag (gtag.js) - Google Analytics