慎用SELECT INTO复制表

简介: 原文:慎用SELECT INTO复制表很多时候我们习惯于用SELECT INTO复制一个表或表结构,因为它方便,快捷,而且在某些情况下效率比INSERT INTO 效率要高一些。但是要注意: SELECT INTO 复制表或表结构的时候,只是得到了一个“外壳”,就像克隆人一样,只是得到了一个躯体,个人的意识、回忆都不会克隆的。
原文: 慎用SELECT INTO复制表

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

SET  ANSI_NULLS  ON
GO

-- 创建
IF   OBJECT_ID (N ' Groups ' IS   NOT   NULL
    
BEGIN
        
PRINT   ' This table have been existed ' ;
        
DROP   TABLE  Groups;
    
END  
ELSE
    
BEGIN
        
CREATE   TABLE   [ dbo ] . [ Groups ]
        (
            
[ GroupID ]          SMALLINT      IDENTITY ( 1 1 ),
            
[ GroupName ]        NVARCHAR ( 50 ),
            
[ Description ]      NVARCHAR ( 100 ),
            
CONSTRAINT   [ PK_Groups_GroupID ]   PRIMARY   KEY (GroupID)
        )
    
END
GO

-- 添加数据
INSERT   INTO  dbo.Groups
VALUES  ( ' SuperAdmin ' ' 超级管理员 ' );

INSERT   INTO   dbo.Groups
VALUES ( ' CusServGroup ' ' 客服部门组 ' );

INSERT   INTO   dbo.Groups
VALUES ( ' CommonGroup ' ' 普通部门组 ' );
GO


DROP   TABLE  dbo.Users
CREATE   TABLE   [ dbo ] . [ Users ]
(
  
[ UserId ]          BIGINT   IDENTITY ( 1 1 NOT   NULL  ,
  
[ UserName ]        NVARCHAR ( 25 NULL  ,
  
[ PassWord ]        NVARCHAR ( 50 NULL  ,
  
[ Sex ]             BIT   NULL  ,
  
[ GroupID ]         SMALLINT  ,    
  
CONSTRAINT   [ PK_Users_UserId ]   PRIMARY   KEY   CLUSTERED  (  [ UserId ]   ASC  ),
  
CONSTRAINT   [ FK_Users_Groups_GroupID ]   FOREIGN   KEY (GroupID)  REFERENCES  Groups(GroupID)
)
GO

ALTER   TABLE   [ dbo ] . [ Users ]   ADD   CONSTRAINT   [ DF_Users_Sex ]    DEFAULT  (( 0 ))  FOR   [ Sex ]
GO


CREATE   TRIGGER  TRG_Users  ON  dbo.Users
AFTER 
DELETE
AS
SET   IDENTITY_INSERT  dbo.Users  ON ;

INSERT   INTO  UserHistory
(UserId, UserName, PassWord, Sex, GroupID)
SELECT   *   FROM  deleted
GO




INSERT    INTO  dbo.Users( UserName, PassWord, Sex, GroupID )
VALUES   (  ' Kerry ' ' 312ddfjdf ' ,   1 ,     1           )
 
INSERT    INTO  dbo.Users( UserName, PassWord, Sex, GroupID )
VALUES   (  ' test '   ' 312ddfjdf ' 0 3    )

 

 

我们用下面的语句复制下表Users,我们具体可以从下图中看到表User与TestUser结构的不同了

SELECT   *   INTO  TestUser  FROM   dbo.Users

 

 

目录
相关文章
|
关系型数据库 MySQL
MYSQL 不允许在子查询的同时删除原表数据的解决方法 specify target table
MYSQL 不允许在子查询的同时删除原表数据的解决方法 specify target table
100 0
数据更新语句INSERT语句、UPDATE语句、DELETE语句等,用于向数据表中插入、更新或删除数据。示例
数据更新语句INSERT语句、UPDATE语句、DELETE语句等,用于向数据表中插入、更新或删除数据。示例
94 1
|
SQL 数据库
拷贝的表的SQL语句 SELECT INTO 和 INSERT INTO SELECT的用法与区别
语句形式为:Insert into Table2(field1,field2,…) select value1,value2,… from Table1
205 0
|
SQL 关系型数据库 MySQL
|
SQL 数据库管理
【SQL开发实战技巧】系列(九):一个update误把其他列数据更新成空了?Merge改写update!给你五种删除重复数据的写法!
本篇文章讲解的主要内容是:***你有没有经历过一个update把其他列数据清空了、使用merge更新合并记录、删除违反参照完整性的记录、给你五种删除重复数据的写法*** 【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。
【SQL开发实战技巧】系列(九):一个update误把其他列数据更新成空了?Merge改写update!给你五种删除重复数据的写法!
|
关系型数据库 MySQL
MySQL: INSERT INTO SELECT 语句实现数据快速复制
MySQL: INSERT INTO SELECT 语句实现数据快速复制
237 0
|
SQL 存储 缓存
执行update语句,用没用到索引,区别大吗?
我们都知道,当执行 select 查询语句时,用没用到索引区别是很大的,若没用到索引,一条 select 语句可能执行好几秒或更久,若使用到索引则可能瞬间完成。那么当执行 update 语句时,用没用到索引有什么区别呢,执行时间相差大吗?本篇文章我们一起来探究下。
417 0
|
关系型数据库 MySQL
MySQL防止重复插入相同记录 insert if not exists
MySQL防止重复插入相同记录 insert if not exists
1466 0
|
关系型数据库 MySQL 数据库
插入命令 insert 和查询命令 select 的组合使用|学习笔记
快速学习插入命令 insert 和查询命令 select 的组合使用
2385 0
|
SQL Oracle 关系型数据库
为什么忘记commit也会造成select查询的性能问题
今天遇到一个很有意思的问题,一个开发人员反馈在测试服务器ORACLE数据库执行的一条简单SQL语句非常缓慢,他写的一个SQL没有返回任何数据,但是耗费了几分钟的时间。让我检查分析一下原因,分析解决过后,发现事情的真相有点让人哭笑不得,但是也是非常有意思的。
1014 0
下一篇
无影云桌面