`

create table tb as select 和create table tb like的区别(转载)

 
阅读更多

目的:测试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子句

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

GAME OVER

分享到:
评论

相关推荐

    SQL Server基本语句.docx

    * 查找: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 ...

    经典SQLSERVER语句大全[参照].pdf

    - `CREATE TABLE tab_new AS SELECT col1, col2 FROM tab_old` 5. **删除表**:`DROP TABLE`语句用于删除表,例如`DROP TABLE tabname`。 6. **添加列**:若需向表中添加列,使用`ALTER TABLE`语句,如`ALTER ...

    SQL语句精要

    CREATE VIEW StudentInfo AS SELECT StudentID, Name, Age FROM Students; ``` ##### 删除视图 - **语法**: ```sql DROP VIEW view_name; ``` - **描述**:此命令用于删除视图`view_name`。 - **示例**: ``...

    SQL命令大全.doc

    - **CREATE TABLE**:创建新的表结构,例如`CREATE TABLE tb1 (Id int NOT NULL PRIMARY KEY, name VARCHAR, ...)`。 - **ALTER TABLE**:修改表结构,可以添加新列,但一旦添加,列不能被删除,且在某些数据库...

    MySQL快速学习

    创建视图的基本语法是:CREATE VIEW view_name AS SELECT column1, column2 FROM table_name WHERE condition。 9. MySQL.ini文件和MySQL窗口 在Windows系统中,MySQL的配置信息存储在MySQL.ini文件中,而在类Unix...

    超实用sql语句

    B:create table tab_new as select col1,col2… from tab_old definition only 5、说明:删除新表 drop table tabname 6、说明:增加一个列 Alter table tabname add column col type 注:列增加后将不能删除。DB2...

    php数据库简单语法

    - `SELECT COUNT(*) AS total FROM table_name;` 统计记录数。 - `SELECT AVG(col) AS avg_value FROM table_name;` 计算平均值。 - `SELECT MAX(col) AS max_value FROM table_name;` 获取最大值。 - `SELECT ...

    表的相关查询(最全面的查询语句集合)

    CREATE TABLE tb (id INT, name VARCHAR(50) DEFAULT 'abc', num INT DEFAULT 5); INSERT INTO tb (id) SELECT 1; INSERT INTO tb SELECT 1, 'oo', 100; INSERT INTO tb (id, name) SELECT 1, 'oo'; GO DECLARE @...

    经典SQL语句大全

    B:create table tab_new as select col1,col2… from tab_old definition only 5、说明:删除新表 drop table tabname 6、说明:增加一个列 Alter table tabname add column col type 注:列增加后将不能删除。DB2...

    数据库操作语句大全(sql)

    B:create table tab_new as select col1,col2… from tab_old definition only 5、说明:删除新表 drop table tabname 6、说明:增加一个列 Alter table tabname add column col type 注:列增加后将不能删除。DB2...

    MySql内存数据库.pdf

    - `SELECT * FROM tb_test WHERE names LIKE '%chen_qing%';`:查询tb_test表中names列符合'chen_qing'通配符模式的所有记录。 需要注意的是,由于文档内容是通过OCR扫描技术生成,可能会存在一些文字识别错误或...

    MySQL的基本语法

    - 使用 `SELECT` 子句从其他表中读取数据创建新表:`CREATE TABLE new_table AS SELECT * FROM existing_table;` - 设置主键、唯一索引等约束条件:例如,`CREATE TABLE students (id INT PRIMARY KEY, name VARCHAR...

    hive操作.docx

    CREATE TABLE new_table AS SELECT ..., new_column_name AS old_column_name, ... FROM old_table; DROP TABLE old_table; RENAME TABLE new_table TO old_table; ``` 3. **修改表名**:在Hive中,可以使用`...

    msyql复习资料

    `,查看表结构用`SHOW CREATE TABLE tb_name;`,描述表为`DESCRIBE tb_name;`,删除表用`DROP TABLE [IF EXISTS] tb_name;`。修改表包括更改表名、字段、存储引擎等,例如`ALTER TABLE think_user ENGINE = MyISAM;`...

    SQL 基本语句总结

    - **语法**:`CREATE TABLE table_name (column1 datatype, column2 datatype, ...);` - **示例**:`CREATE TABLE employee (id INT, name VARCHAR(255), age INT);` ##### ALTER TABLE - 修改表 - **功能**:修改...

    经典SQLSERVER语句大全经典SQLSERVER语句大全

    CREATE TABLE tab_new AS SELECT col1, col2 FROM tab_old DEFINITION ONLY; ``` - **功能**:根据查询结果的列定义来创建新表。 - **参数**:`tab_new` 是新表名称;`tab_old` 是源表;`col1`, `col2` 是选择的...

    mysql语句实现简单的增、删、改、查操作示例

    CREATE TABLE tb_goods01 LIKE tb_goods; ``` 5. **删除数据表**: - 使用`DROP TABLE`语句删除数据表,如删除`tb_goods01`: ```sql DROP TABLE tb_goods01; ``` 6. **添加列(字段)**: - 使用`ALTER ...

    MYSql常用语句

    CREATE TABLE IF NOT EXISTS tb_new (SELECT * FROM db.table1); ``` #### 七、修改表结构 随着项目需求的变化,可能需要对已有的表进行结构调整。 ```sql ALTER TABLE db.table1 ADD COLUMN new_field INT(5) ...

    MySql_内存数据库

    CREATE TABLE tb_admin ( id INT AUTO_INCREMENT PRIMARY KEY, nickname VARCHAR(50) NOT NULL, password CHAR(50) NOT NULL, create_time DATETIME ); ``` 查看表结构可以通过`SHOW COLUMNS`或`DESCRIBE`命令...

Global site tag (gtag.js) - Google Analytics