SQL 向表中插入数据(单行/多行)

单行插入

语法

INSERT [INTO] 表名  [(列名)]  VALUES(值列表)

方括号[]中的内容在某些情况下可以省略

注意事项:

每次插入一行数据,除了标识列和可以为NULL的列,其余列一定要插入数据

插入的每个数据值的数据类型,精度和小数位数必须与相应的列匹配

不能为标识列插入值

如果在设计表的时候就指定了某列不允许为空,则必须插入数据

插入的数据项,可以符合检查约束的要求()

具有缺省值的列,可以使用DEFAULT(缺省)关键字来代替插入的数值

--[1]向含有标识列的表中插入数据,要求标识列不允许手动插入数据(一个表最多只能有一个标志列)
USE E_Market
GO 
INSERT INTO CommoditySort VALUES('手机数码','电脑数码') 
--因为这张表中只有三列SortId,SortName1,SortName2,第一列为标识列跳过,VALUES对应后序两列,故列名可省略
SELECT *FROM CommoditySort
GO
--[2]向表中所有的列插入数据,要求值的顺序必须与列的顺序完全一致,列名可省略
INSERT INTO UserInfo VALUES('kkk','iloveyou','张可',1,'zk@sohu.com','北京海定','010-23132')
SELECT *FROM UserInfo
GO
--[3]向表中非空列插入数据(表中含有允许为空的列),要求列的个数与值的个数完全一致
INSERT INTO CommodityInfo(SortId,CommodityName,InPrice,OutPrice,Amount) --指定要插入的列名
VALUES(1,'索尼z3',3333,4299,100)
SELECT *FROM CommodityInfo
GO
--[4]向有默认值的表中添加数据,用关键字DEFAULT代替默认值
INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayMoney,PayWay,OrderTime,Confirm,SendGoods)
VALUES('yoyo',2,2,3333,DEFAULT,'2011-11-11',1,1)--PayWay保持默认值
SELECT *FROM OrderInfo
GO
后来对[1]有个 小小的疑惑,如果标识列是在中间,我们又不写出列名会怎么样,试过后是,答案是只要相对顺序正确,不会有影响

USE Demo
IF EXISTS(SELECT *FROM SYSOBJECTS WHERE NAME='RRR')
DROP TABLE RRR
CREATE TABLE RRR--创建一张新表RRR
(
	ID INT PRIMARY KEY(ID),
	Year INT ,
	Income int identity(2000,10),--标识列在中间
	Name nvarchar(20)
)
GO
INSERT INTO RRR 
VALUES (3,2,'ADASD')--只插入VALUES,我们想让它对应ID Year Name
SELECT *FROM RRR
GO
结果VALUES按照对应的ID Year Name插入了,跳过了标识列 Income

说明如果列中存在标识列,我们填入的数据类型与其余非标识列列的类型一致,顺序相同,无论标识列在哪个位置,VALUES都可以跳过标识列,对应地填写上去。

总之:以后如果列名不多,我就干脆用【3】这种方法,除了标识列,把要插入的列名都一一列出来,要用到默认值就用DEFAULT代替,清楚明了。

---------------------------------

多行插入

需要有一张源表,然后再从源表根据需要把其中的几列或者全部列提取出来,存到另一张表

法一:

语法           --蓝色为关键字

INSERT INTO  表名(表中的列名)

SELECT xxx,xxx,xxx         --xxx表示源表中的列名,用英文逗号隔开

FROM 源表名
--举例:将数据库E_Market中的表UserInfo中的列UserId,UserName,UserAddress,Phone提取出来

--      存放在另一张已经创建好的表UserAddress中
USE E_Market
IF EXISTS(SELECT *FROM SYSOBJECTS WHERE NAME='UserAddress')
DROP TABLE UserAddress
GO
CREATE TABLE UserAddress
(
	UID varchar(20) PRIMARY KEY(UId) NOT NULL,--对应源表UserId
	Uname varchar(50) NOT NULL, --UserName
	UAddress varchar(200), --UserAddress
	UPhone varchar(20) NOT NULL  --Phone
)
--现已存在表 UserAddress(下面简称U表)
--语法
--INSERT INTO<表名>(列名)
--SELECT<源表中的列名>
--FROM<源表名> 
--添加到U表中,要求这个U表必须存在
--而且U表中列名的个数,顺序,数据类型必须与来源表中所要提取的列的个数,顺序,类型一致
--U表中的列名可以与来源表的列名不同
GO
select *from UserAddress
--一次性将UserInfo中的数据插入到表UserAddress中
INSERT INTO UserAddress(UID,Uname,UAddress,UPhone)
Select UserId,UserName,UserAddress,Phone
From UserInfo
GO

法二:在插入的过程中,创建新表来存储提取出来的信息,注意,新表实现不能存在

语法:           --蓝色为关键字

SELECT XXX,XXX,XXX,XXX       --XXX表示源表中的列名

INTO  NTN                --NewTable NAME表示创建的新表的表名,事先不能存在

FROM STN                --SorceTable NAME,源表表名

--举例:将表UserInfo中的列UserId,UserName,UserAddress,Phone提取出来
--     在插入到新表中,要求新表的事先不存在,而是在插入过程中新建
select UserId,UserName,UserAddress,Phone
INTO AddressList --在过程中新建的表
From UserInfo  
两种方法的区别:

1.当存放数据的表中,没有设置主键PK时,就可以重复执行;当表中设置有主键,如上面法一的例子,重复插入就会主键重复,所以无法再重复执行。

2.方法2不允许多次执行,因为执行第一次就已经创建了新表,再执行第二次就是重复创表了,自然不行。

 
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值