SQL必知必会-数据插入

INSERT

顾名思义,INSERT用来将行插入(或添加)到数据库表。插入有几种方式:
1.插入完整的行;
2.插入行的一部分;
3.插入某些查询的结果。

把数据插入表中的最简单方法是使用基本的INSERT语法,它要求指定表名和插入到新行中的值。下面举一个例子:

INSERT INTO Customers
VALUES('1000000006',
				'Toy Land',
				'123 Any Street',
				'New York',
				'NY',
				'11111',
				'USA',
				NULL,
				NULL);

这个例子将一个新顾客插入到Customers表中。存储到表中每一列的数据在VALUES子句中给出,必须给每一列提供一个值。如果某列没有值,则应该使用NULL值(假定表允许对该列指定空值)。各列必须以它们在表定义中出现的次序填充。

虽然这种语法很简单,但并不安全,应该尽量避免使用。上面的 SQL 语句高度依赖于表中列的定义次序,还依赖于其容易获得的次序信息。即使可以得到这种次序信息,也不能保证各列在下一次表结构变动后保持完全相同的次序。因此,编写依赖于特定列次序的 SQL 语句是很不安全的,这样做迟早会出问题。编写INSERT语句的更安全(不过更烦琐)的方法如下:

INSERT INTO Customers(cust_id,
										cust_name,
										cust_address,
										cust_city,
										cust_state,
										cust_zip,
										cust_country,
										cust_contact,
										cust_email)
VALUES('1000000006',
				'Toy Land',
				'123 Any Street',
				'New York',
				'NY',
				'11111',
				'USA',
				NULL,
				NULL);

提示:总是使用列的列表
不要使用没有明确给出列的INSERT语句。给出列能使 SQL 代码继续发挥作用,即使表结构发生了变化。

警告:小心使用 VALUES
不管使用哪种INSERT语法,VALUES的数目都必须正确。如果不提供列名,则必须给每个表列提供一个值;如果提供列名,则必须给列出的每个列一个值。否则,就会产生一条错误消息,相应的行不能成功插入。

插入部分行

正如所述,使用INSERT的推荐方法是明确给出表的列名。使用这种语法,还可以省略列,这表示可以只给某些列提供值,给其他列不提供值。
请看下面的例子:

INSERT INTO Customers(cust_id,
										cust_name,
										cust_address,
										cust_city,
										cust_state,
										cust_zip,
										cust_country)
VALUES('1000000006',
				'Toy Land',
				'123 Any Street',
				'New York',
				'NY',
				'11111',
				'USA');

在本课前面的例子中,没有给cust_contact和cust_email这两列提供值。这表示没必要在INSERT语句中包含它们。因此,这里的INSERT语句省略了这两列及其对应的值。
警告:省略列
如果表的定义允许,则可以在INSERT操作中省略某些列。省略的列必须满足以下某个条件。
该列定义为允许NULL值(无值或空值)。
在表定义中给出默认值。这表示如果不给出值,将使用默认值。
如果对表中不允许NULL值且没有默认值的列不给出值, DBMS 将产生错误消息,并且相应的行插入不成功。

插入检索出的数据

INSERT一般用来给表插入具有指定列值的行。INSERT还存在另一种形式,可以利用它将SELECT语句的结果插入表中,这就是所谓的INSERT-SELECT。顾名思义,它是由一条INSERT语句和一条SELECT语句组成的。

INSERT INTO Customers(cust_id,
										cust_contact,
										cust_email,
										cust_name,
										cust_address,
										cust_city,
										cust_state,
										cust_zip,
										cust_country)
SELECT cust_id,
				cust_contact,
				cust_email,
				cust_name,
				cust_address,
				cust_city,
				cust_state,
				cust_zip,
				cust_country
FROM CustNew;

说明:新例子的说明
这个例子从一个名为CustNew的表中读出数据并插入到Customers表。为了试验这个例子,应该首先创建和填充CustNew表。在填充CustNew时,不应该使用已经在Customers中用过的cust_id值(如果主键值重复,后续的INSERT操作将会失败)。

提示: INSERT SELECT 中的列名
为简单起见,这个例子在INSERT和SELECT语句中使用了相同的列名。但是,不一定要求列名匹配。事实上, DBMS 一点儿也不关心SELECT返回的列名。它使用的是列的位置,因此SELECT中的第一列(不管其列名)将用来填充表列中指定的第一列,第二列将用来填充表列中指定的第二列,如此等等。

INSERT SELECT中SELECT语句可以包含WHERE子句,以过滤插入的数据。
提示:插入多行INSERT通常只插入一行。要插入多行,必须执行多个INSERT语句。
INSERT SELECT是个例外,它可以用一条INSERT插入多行,不管SELECT语句返回多少行,都将被INSERT插入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值