使用INSERT ... SELECT

问题描述:

INSERT的这种变体如何工作(请参阅链接)?使用INSERT ... SELECT

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' 

还可以将其用于替换的插入和更新?如果能以这种方式使用,是否仅限于插入静态值(选择value1 = blah ...)还是有办法传递NOW()值?

它插入数据与列名表california_authors AU_ID,的au_lname,au_fname它SELECT语句select au_id, au_lname, au_fname from authors where state = 'CA'

上面的select语句为您提供了3列的表,插入列匹配得到它的数据数。

说你有表(生日

ID |名字|生日

那么你可以做一个插入这样

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

这将插入新行与定义的值生日。

您也可以结合使用从将和在选择

该行定义的值“静态”插入数据获取从表中的数据从SELECT查询返回被简单地插入,就像如果你要使用一组VALUES表达式自己指定所有行。在两种情况下,字段数和类型都应该匹配。

是的,因为你有一个表像ARTICLES(ID, TITLE, BODY, DATE)和你想要的DATE字段插入期间被设置为NOW(),你可以做这样的事情:

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

随后的NOW()值会而不是other_articles表中的日期列。

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

它不限于静态值。

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 

你应该始终确保正被插入的数据类型的列的数据类型相匹配。

+0

“插入无法执行更新”。是和不是。我已经讨论了MySQL变体INSERT INTO ... ON DUPLICATE KEY UPDATE Ages = 10。尽管如此,它的用处有点不妥。 – 2011-08-04 14:28:49