很多时候我们习惯于用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值也不一样了。
相关推荐
- `DELETE FROM 数据表`:删除数据表中的所有记录,慎用,因为这将是不可逆的操作。 4. **添加数据记录**: - `INSERT INTO 数据表 (字段1, 字段2, 字段3...) VALUES (值1, 值2, 值3...)`:插入新记录到数据表中...
3.in 和 not in 也要慎用,否则会导致全表扫描。 4.如果在 where 子句中使用参数,也会导致全表扫描。 5.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。 6.应尽量避免在...
` 则删除整个表(慎用)。 9. **JOIN操作**:用于合并两个或多个表的数据。`INNER JOIN`返回匹配的行,`LEFT JOIN`返回左表的所有行,即使右表没有匹配,`RIGHT JOIN`反之,`FULL JOIN`返回所有可能的组合。 10. *...
-- 删除所有记录(慎用!) DELETE FROM students; ``` 6. 其他操作 - `COUNT(*)`: 计算表中的记录数 ```sql SELECT COUNT(*) FROM students; ``` - `ORDER BY`: 对查询结果进行排序 ```sql SELECT * FROM students...
5. in和not in操作符也要慎用,否则会导致全表扫描。 in和not in操作符可以导致引擎放弃使用索引,而进行全表扫描,影响查询效率。可以使用between操作符来代替in操作符,例如:select id from t where num between...
慎用自动增长字段 虽然自动增长字段使用方便,但可能会导致性能问题。 #### 23. 创建表时避免使用`SELECT INTO` 使用`SELECT INTO`创建表可能导致日志文件膨胀,应使用`CREATE TABLE`命令创建表后再进行数据插入...
此外,in 和 not in 也要慎用,否则会导致全表扫描。可以使用 between instead of in。例如,select id from t where num between 1 and 3。 在 where 子句中使用参数也会导致全表扫描。可以使用强制查询使用索引的...
没有条件是全部删除,慎用 3、改数据 update 表名 set 列1 =值1,列2 = 值2 where 条件; 不写条件就都修改了 4、查询数据: a:查询表中全部数据 select * from 表名; 四、查数据 1、基本语法 格式:select ...
##### 2.9 过滤匹配慎用函数 - 尽量避免在`where`子句中使用函数,这可能会导致索引失效。 - 示例: ```sql -- 错误示例 select * from tab1 where lower(col1) = 'value'; -- 正确示例 select * from tab1 ...
#### 策略6:不等于要慎用 使用不等于操作符(`!=` 或 `)` 通常会导致全表扫描,因为这些操作无法利用索引。 - **示例**: - 使用不等于操作符: ```sql EXPLAIN SELECT * FROM staffs WHERE NAME!='July'; ...
11. **避免无意义的查询**:不要创建不返回结果的查询,如 SELECT INTO 空表,可以直接创建表。 12. **EXISTS 优于 IN**:在某些情况下,使用 EXISTS 代替 IN 可以提高查询效率。 13. **考虑数据重复性**:如果...
5. in 和 not in 也要慎用,否则会导致全表扫描。 in 和 not in 操作符可以导致全表扫描,应该尽量避免使用它们。可以使用其他方法来代替它们,例如使用 BETWEEN 操作符。 6. 如果在 where 子句中使用参数,也会...
- **事务管理**:尽量避免大事务操作,减少并发问题,慎用`holdlock`子句。 - **表访问**:尽量减少重复访问同一张或多张表,特别是对于大数据量的表,可先将数据提取到临时表中再进行处理。 - **游标使用**:...
##### 2.9 过滤匹配慎用函数 在WHERE子句中尽量避免使用函数来过滤数据,因为这样做可能会导致索引失效,进而影响查询性能。 示例(避免): ```sql SELECT * FROM CUSTOMER WHERE UPPER(NAME) = 'JOHN'; ``` ...
- 慎用大型临时表与其他大表的连接查询和修改,以减轻系统表的负担。 4. 合理的算法选择: 结合SQL优化技术及ASE Tuning手册,根据实际应用比较多种算法,选择资源消耗最少、效率最高的方法。可以使用ASE的调优...
f) **大表连接和修改**:慎用大型临时表与其他大表的连接查询和修改,以减轻tempdb的系统表负担。 6. **算法选择**: 结合SQL优化技术,参照ASE Tuning手册,对比多种算法,选择资源消耗最少、效率最高的方法。...
// 删除所有记录(慎用) ``` 9. **聚合函数** - **COUNT()**:计算行数。 - **SUM()**:求和。 - **AVG()**:平均值。 - **MAX()**:最大值。 - **MIN()**:最小值。 10. **连接查询(JOINs)** - **...
// 删除表中所有数据,慎用! ``` 八、备份数据库 备份数据库是为了防止数据丢失。这通常通过数据库管理系统(如MySQL的`mysqldump`或SQL Server的`BACKUP DATABASE`)来完成,命令会因不同的数据库系统而异。 九...
5. **慎用IN和NOT IN**:对于连续数值,使用BETWEEN可能更高效。同时,IN列表中的元素应尽可能少,过多元素可能导致全表扫描。 6. **LIKE操作符的优化**:全匹配的LIKE操作符(如`LIKE 'abc'`)可以利用索引,但...