【问题标题】:Use of INSERT ... SELECT使用 INSERT ... SELECT
【发布时间】:2011-05-05 10:11:53
【问题描述】:

这个 INSERT 的变体是如何工作的(见链接)?

http://www.sqlteam.com/article/using-select-to-insert-records

INSERT california_authors (au_id, au_lname, au_fname)
SELECT au_id, au_lname, au_fname
FROM authors
WHERE State = 'CA'

也可以用来代替 INSERT 和 UPDATE 吗?如果可以这样使用,是仅限于插入静态值(select value1=blah ...)还是有办法传递一个NOW()值?

【问题讨论】:

    标签: sql select insert


    【解决方案1】:

    SELECT 查询返回的行被简单地插入,就像您要使用一组VALUES 表达式自己指定所有行一样。在这两种情况下,字段计数和类型都应该匹配。

    是的,假设您有一个类似ARTICLES(ID, TITLE, BODY, DATE) 的表,并且您希望在插入期间将DATE 字段设置为NOW(),您可以这样做:

    INSERT articles(title, body, date)
    SELECT title, body, NOW()
    FROM other_articles
    

    然后将使用NOW() 的值代替other_articles 表中的日期列。

    【讨论】:

      【解决方案2】:

      Insert 不能执行更新 - 它只能将数据插入到表中,不能更新现有数据。

      不限于静态值。

      Insert Into SomeTable (FirstName, LastName, FullName, ModifiedDate, Comment, Age)
      
      Select FirstName,
             LastName,
             FirstName + ' ' + LastName,
             GetDate(),
             'This is the best comment ever',
             dbo.CustomFunctionToCalculateAge(DateOfBirth)
      
      From Users
      

      你也可以省略列声明(虽然不推荐)

      Insert Into Ages
      Select 10
      

      您应该始终确保插入的数据类型与列的数据类型相匹配。

      【讨论】:

      • “插入无法执行更新”。是和不是。我遇到了 MySQL 变体 INSERT INTO ... ON DUPLICATE KEY UPDATE Ages = 10。不过它的使用有点狡猾。
      【解决方案3】:

      它使用列名 au_id、au_lname、au_fname 将数据插入到表 california_authors 中,并从 select 语句 select au_id, au_lname, au_fname from authors where state = 'CA' 中获取数据

      上面的 select 语句为您提供了一个与插入列号匹配的包含 3 列的表。

      假设你有这张桌子(生日

      标识 |名字 |生日

      那么你可以像这样插入

      insert birthdates (id,firstname,birthdate) select 1,'Steven',NOW()

      这将使用定义的值在生日中插入一个新行。

      您还可以通过在 select 中定义值来结合从表中获取数据与添加 from 和“静态”插入数据

      【讨论】:

        猜你喜欢
        • 2018-08-18
        • 2021-07-22
        • 1970-01-01
        • 2016-05-03
        • 2012-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-10
        相关资源
        最近更新 更多