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

    xiaoxiao2021-03-25  57

    单行插入

    语法

    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不允许多次执行,因为执行第一次就已经创建了新表,再执行第二次就是重复创表了,自然不行。

     
    转载请注明原文地址: https://ju.6miu.com/read-27645.html

    最新回复(0)