INSERT INTO与SELECT INTO

有什么区别使用

SELECT ... INTO MyTable FROM... 

 INSERT INTO MyTable (...) SELECT ... FROM .... 

从BOL [ INSERT , SELECT … INTO ],我知道使用SELECT … INTO将在默认文件组中创build插入表如果它尚不存在),并且此语句的日志logging取决于恢复数据库的模型。

  1. 哪种说法更可取?
  2. 还有其他的性能影响?
  3. SELECT … INTO通过INSERT INTO …的好用例是什么?

编辑:我已经表明,我知道那个SELECT INTO …创build一个表,它不存在。 我想知道的是SQL包含这个语句的原因是什么? 它是在插入行后面做一些不同的事情,还是只是在CREATE TABLEINSERT INTO之上的语法糖。

  1. 他们做不同的事情。 表存在时使用INSERT 。 当它不使用时,使用SELECT INTO

  2. 是。 INSERT没有表提示通常是logging。 假设适当的跟踪标志被设置, SELECT INTO被最小化logging。

  3. 根据我的经验, SELECT INTO最常用于中间数据集(如#temp表),或者像备份一样复制整个表。 INSERT INTO已知结构的现有表时使用INSERT INTO

编辑

要解决您的编辑,他们做不同的事情。 如果您正在创build一个表,并且想要定义结构,请使用CREATE TABLEINSERT 。 可以创build的问题示例:您有一个带有varchar字段的小表。 表中最大的string现在是12个字节。 您的真实数据集将需要多达200个字节。 如果你从你的小表中做SELECT INTO来创build一个新的INSERT ,那么以后的INSERT将会因为你的字段太小而失败并出现截断错误。

  1. 哪种说法更可取? 取决于你在做什么。

  2. 还有其他的性能影响? 如果表是一个permananent表,则可以在创build表时创build索引,这对于性能既有负面影响,也有正面影响。 select into不会重新创build当前表上存在的索引,因此表的后续使用可能比需要的慢。

  3. SELECT … INTO通过INSERT INTO …的好用例是什么? 如果您事先不知道表结构,则select进入。 编写速度比创build表格和插入脚本要快,所以有时用于加速开发。 在创build快速临时表来testing特定查询的事物或备份表(可能是要删除的logging)时,使用它通常会更快。 在运行多次的生产代码(临时表除外)中应该很less见,因为如果表已经存在,它将会失败。

那些不知道自己在做什么的人有时会使用不当的东西。 因此,他们可以在数据库中造成严重破坏。 我强烈地感觉到,将SELECT INTO用于除一次性表之外的任何东西(临时备份,临时表将在存储过程结束时消失等)是不合适的。 永久表需要对其devise进行真正的思考 ,SELECT INTO可以轻松避免考虑任何事情,甚至像哪些列和哪些数据types那样基本。

一般来说,我更喜欢使用create table和insert语句 – 您拥有更多的控制权,对于可重复的stream程来说更好。 此外,如果表是永久性表,则应该从独立的创build表脚本(源代码pipe理中的一个脚本)创build,因为创build永久对象通常不应插入/删除/更新或从中进行select一张桌子。 对象更改应该与数据更改分开处理,因为对象超出了特定的插入/更新/select/删除的需要。 您需要考虑最好的数据types,您需要考虑FK约束和PK等约束,您需要考虑审计需求,您需要考虑索引等。

每个语句都有一个独特的用例。 它们不可互换。

SELECT...INTO MyTable...创build一个新的MyTable ,其中之前不存在。

INSERT INTO MyTable...SELECT...MyTable已经存在时使用。

实际上, SELECT … INTO不仅创build表,而且如果它已经存在,将失败,所以基本上只有当你插入的表不存在时才使用它。

关于你的编辑:

我个人主要使用SELECT … INTO当我创build一个临时表。 这对我来说是主要用途。 不过,在创build具有与其他表格类似的许多列的新表格时,我也会使用它,然后对其进行编辑以节省时间。

主要区别在于SELECT INTO MyTable将创build一个名为MyTable的新表,而INSERT INTO则要求MyTable已经存在。

只有在表不存在的情况下,您才会使用SELECT INTO,并且您希望根据查询结果创build它。 因此,这两个陈述实在是无法比拟的。 他们做了非常不同的事情。

一般来说,SELECT INTO用于一个closures任务,而INSERT INTO用于定期向表中添加行。

编辑:
虽然可以使用CREATE TABLE和INSERT INTO来完成SELECT INTO的操作,但是使用SELECT INTO您不必事先知道表定义。 SELECT INTO可能包含在SQL中,因为它使诸如临时报告或复制表等任务变得更加容易。

SELECT INTO通常用于生成临时表或复制另一个表(数据和/或结构)。

在日常代码中,您使用INSERT,因为您的表应该已经存在,可以被读取,更新,删除,联接等。注意:INTO关键字对于INSERT

也就是说,应用程序通常不会创build和删除表作为正常操作的一部分,除非它是用于某些范围受限和特定用途的临时表。

由SELECT INTO创build的表将不具有任何键或索引或约束,而不像真实,持久的已经存在的表

2不能直接比较,因为它们在使用上几乎没有重叠

select进入为您创build新表,然后从源表中插入logging。 新创build的表具有与源表相同的结构。如果尝试将select用于现有表,则会产生错误,因为它会尝试创build具有相同名称的新表。 在插入行之前,插入需要在您的数据库中存在该表。

我只想涉及与绩效有关的问题的第二点,因为没有其他人已经覆盖了这一点。 当涉及到具有大型数据集的表时,select进入比插入要快得多。 当我必须读取一个非常大的表格时,我更喜欢select into。 插入一个1000万行的表可能需要几个小时,而select将在几分钟内做到这一点,而对于新表损失索引,你可以通过查询重新创build索引,仍然可以节省更多的时间插入。

select into和insert into之间的简单区别是: – > select into不需要现有的表。 如果要复制表A的数据,只需从A中select* INTO [tablename]即可。这里,表名可以是现有的表或者将创build与表A相同结构的新表。

– >插入进去做需要现有的table.INSERT INTO [tablename] SELECT * FROM A ;. 这里tablename是一个现有的表。

Select Into通常比较受欢迎,可以复制数据,尤其是备份数据。

您可以按照您的要求使用,完全是开发人员的select,应该在他的情况下使用。

性能明智插入INTO是快速的。

参考文献

https://www.w3schools.com/sql/sql_insert_into_select.asp https://www.w3schools.com/sql/sql_select_into.asp

select进入大数据集可能是好的只有一个用户使用一个单一的连接到数据库做批量操作任务。 我不build议使用

 SELECT * INTO table 

因为这将创build一个大事务并创build模式locking来创build该对象,从而阻止其他用户在SELECT INTO操作完成之前创build对象或访问系统对象。

作为概念certificate打开2届会议,在第一次会议尝试使用

 select into temp table from a huge table 

并在第二部分尝试

 create a temp table 

并检查locking,阻塞和第二次会话的持续时间来创build一个临时表对象。 我的build议是,创build和插入语句总是一个好习惯,如果需要最小化日志logging,则使用跟踪标志610。