`

慎用SELECT INTO复制表

阅读更多

        很多时候我们习惯于用SELECTINTO复制一个表或表结构,因为它方便,快捷,而且在某些情况下效率比INSERT INTO 效率要高一些。但是要注意: SELECT INTO 复制表或表结构的时候,只是得到了一个“外壳”,就像克隆人一样,只是得到了一个躯体,个人的意识、回忆都不会克隆的。像原表的主键、外键、约束、触发器、索引都不会被复制过来。这点要注意哦,在某些情况下,没有注意的话,会照成“灾难后果的”,下面给个脚本例子,给大家演示下SELECT INTO复制表或表结构时,没有得到原表的主键、timestamp类型字段的DEFAULT值。

  建表SQL:

DROP TABLE IF EXISTS `order_flow`;
CREATE TABLE `order_flow` (
	`req_date` varchar(8) DEFAULT NULL COMMENT '请求日期 YYYYMMDD',
	`req_time` varchar(6) DEFAULT NULL COMMENT '请求日期HHMMSS',
  	`amount` decimal(15,2) DEFAULT NULL COMMENT '交易金额',
	`order_id` varchar(32) NOT NULL COMMENT '订单号',
	`order_desc` varchar(256) DEFAULT NULL COMMENT '订单描述',
  	`create_time` datetime  NOT NULL COMMENT '创建时间',
  	`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP  COMMENT '更新时间',	
  PRIMARY KEY (`order_id`, `req_date`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='交易流水表';

        实例操作如下:

mysql> show create table order_flow;
+------------+------------------------------------------------------------------------------------------------------
| Table      | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
+------------+------------------------------------------------------------------------------------------------------
| order_flow | CREATE TABLE `order_flow` (
  `req_date` varchar(8) NOT NULL DEFAULT '' COMMENT '请求日期 YYYYMMDD',
  `req_time` varchar(6) DEFAULT NULL COMMENT '请求日期HHMMSS',
  `amount` decimal(15,2) DEFAULT NULL COMMENT '交易金额',
  `order_id` varchar(32) NOT NULL COMMENT '订单号',
  `order_desc` varchar(256) DEFAULT NULL COMMENT '订单描述',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`order_id`,`req_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='交易流水表'                                 |
+------------+------------------------------------------------------------------------------------------------------
1 row in set (0.01 sec)

mysql> create table test as select * from order_flow;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table test;
+-------+-----------------------------------------------------------------------------------------------------------
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
+-------+-----------------------------------------------------------------------------------------------------------
| test  | CREATE TABLE `test` (
  `req_date` varchar(8) NOT NULL DEFAULT '' COMMENT '请求日期 YYYYMMDD',
  `req_time` varchar(6) DEFAULT NULL COMMENT '请求日期HHMMSS',
  `amount` decimal(15,2) DEFAULT NULL COMMENT '交易金额',
  `order_id` varchar(32) NOT NULL COMMENT '订单号',
  `order_desc` varchar(256) DEFAULT NULL COMMENT '订单描述',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8                            |
+-------+------------------------------------------------------------------------------------------------------------
1 row in set (0.01 sec)

        我们发现,复制表没有COMMENT、主键,update_time字段的DEFAULT值也不一样了。

  • 大小: 32.7 KB
分享到:
评论

相关推荐

    mysql数据库精华.doc

    - `DELETE FROM 数据表`:删除数据表中的所有记录,慎用,因为这将是不可逆的操作。 4. **添加数据记录**: - `INSERT INTO 数据表 (字段1, 字段2, 字段3...) VALUES (值1, 值2, 值3...)`:插入新记录到数据表中...

    在一个千万级的数据库查寻中,如何提高查询效率?

    3.in 和 not in 也要慎用,否则会导致全表扫描。 4.如果在 where 子句中使用参数,也会导致全表扫描。 5.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。 6.应尽量避免在...

    基本的sql语句

    ` 则删除整个表(慎用)。 9. **JOIN操作**:用于合并两个或多个表的数据。`INNER JOIN`返回匹配的行,`LEFT JOIN`返回左表的所有行,即使右表没有匹配,`RIGHT JOIN`反之,`FULL JOIN`返回所有可能的组合。 10. *...

    sqlite 增删改查简单示例

    -- 删除所有记录(慎用!) DELETE FROM students; ``` 6. 其他操作 - `COUNT(*)`: 计算表中的记录数 ```sql SELECT COUNT(*) FROM students; ``` - `ORDER BY`: 对查询结果进行排序 ```sql SELECT * FROM students...

    怎样提高数据库查询效率.doc

    5. in和not in操作符也要慎用,否则会导致全表扫描。 in和not in操作符可以导致引擎放弃使用索引,而进行全表扫描,影响查询效率。可以使用between操作符来代替in操作符,例如:select id from t where num between...

    SQL语句优化原则

    慎用自动增长字段 虽然自动增长字段使用方便,但可能会导致性能问题。 #### 23. 创建表时避免使用`SELECT INTO` 使用`SELECT INTO`创建表可能导致日志文件膨胀,应使用`CREATE TABLE`命令创建表后再进行数据插入...

    mysql优化提高百万条数据的查询速度.pdf

    此外,in 和 not in 也要慎用,否则会导致全表扫描。可以使用 between instead of in。例如,select id from t where num between 1 and 3。 在 where 子句中使用参数也会导致全表扫描。可以使用强制查询使用索引的...

    mysql数据库操作

    没有条件是全部删除,慎用 3、改数据 update 表名 set 列1 =值1,列2 = 值2 where 条件; 不写条件就都修改了 4、查询数据: a:查询表中全部数据 select * from 表名; 四、查数据 1、基本语法 格式:select ...

    Oracle 开发DBA SQL编写规范

    ##### 2.9 过滤匹配慎用函数 - 尽量避免在`where`子句中使用函数,这可能会导致索引失效。 - 示例: ```sql -- 错误示例 select * from tab1 where lower(col1) = 'value'; -- 正确示例 select * from tab1 ...

    mysql数据库sql优化

    #### 策略6:不等于要慎用 使用不等于操作符(`!=` 或 `)` 通常会导致全表扫描,因为这些操作无法利用索引。 - **示例**: - 使用不等于操作符: ```sql EXPLAIN SELECT * FROM staffs WHERE NAME!='July'; ...

    mysql优化_提高百万条数据的查询速度

    11. **避免无意义的查询**:不要创建不返回结果的查询,如 SELECT INTO 空表,可以直接创建表。 12. **EXISTS 优于 IN**:在某些情况下,使用 EXISTS 代替 IN 可以提高查询效率。 13. **考虑数据重复性**:如果...

    提高SQL处理查询上百万条数据库的速度

    5. in 和 not in 也要慎用,否则会导致全表扫描。 in 和 not in 操作符可以导致全表扫描,应该尽量避免使用它们。可以使用其他方法来代替它们,例如使用 BETWEEN 操作符。 6. 如果在 where 子句中使用参数,也会...

    存储过程编写经验和优化措施

    - **事务管理**:尽量避免大事务操作,减少并发问题,慎用`holdlock`子句。 - **表访问**:尽量减少重复访问同一张或多张表,特别是对于大数据量的表,可先将数据提取到临时表中再进行处理。 - **游标使用**:...

    资深DBA对Oracle编写规范的总结

    ##### 2.9 过滤匹配慎用函数 在WHERE子句中尽量避免使用函数来过滤数据,因为这样做可能会导致索引失效,进而影响查询性能。 示例(避免): ```sql SELECT * FROM CUSTOMER WHERE UPPER(NAME) = 'JOHN'; ``` ...

    SP優化的一些措施

    - 慎用大型临时表与其他大表的连接查询和修改,以减轻系统表的负担。 4. 合理的算法选择: 结合SQL优化技术及ASE Tuning手册,根据实际应用比较多种算法,选择资源消耗最少、效率最高的方法。可以使用ASE的调优...

    SQL Server存储过程编写和优化措施

    f) **大表连接和修改**:慎用大型临时表与其他大表的连接查询和修改,以减轻tempdb的系统表负担。 6. **算法选择**: 结合SQL优化技术,参照ASE Tuning手册,对比多种算法,选择资源消耗最少、效率最高的方法。...

    SQL de 数据库语法整理

    // 删除所有记录(慎用) ``` 9. **聚合函数** - **COUNT()**:计算行数。 - **SUM()**:求和。 - **AVG()**:平均值。 - **MAX()**:最大值。 - **MIN()**:最小值。 10. **连接查询(JOINs)** - **...

    SQL基本操作

    // 删除表中所有数据,慎用! ``` 八、备份数据库 备份数据库是为了防止数据丢失。这通常通过数据库管理系统(如MySQL的`mysqldump`或SQL Server的`BACKUP DATABASE`)来完成,命令会因不同的数据库系统而异。 九...

    百万数据查询优化技巧三十则

    5. **慎用IN和NOT IN**:对于连续数值,使用BETWEEN可能更高效。同时,IN列表中的元素应尽可能少,过多元素可能导致全表扫描。 6. **LIKE操作符的优化**:全匹配的LIKE操作符(如`LIKE 'abc'`)可以利用索引,但...

Global site tag (gtag.js) - Google Analytics