小议主子表INT自增主键插入记录的方法

2016-01-29 16:22 11 1 收藏

小议主子表INT自增主键插入记录的方法,小议主子表INT自增主键插入记录的方法

【 tulaoshi.com - SQLServer 】

 

       主子表最常见的大概就是用在进销存、MRP、ERP里面,比如一张销售订单,订单Order(ID,OrderDate),订单明细OrderDetail(OrderID, ProductID, Num,Price)这个大概就是最简单的主子表了,两个表通过ID与OrderID建立关联,这里主键ID是自增的INT类型,OrderID是表OrderDetail的外键。当然,键的选择方法很多,现在我们选择的是在sql里面最简单的方法。

    对于这样的表结构,我们最常见的问题就是保存的时候怎样处理键值的问题,因为两个表关联非常的紧密,我们进行保存的时候需要把它们放在一个事务里面,这时问题就会出现,Order表中的ID是自动增长型的字段。现在需要我们录入一张订单,包括在Order表中插入一条记录以及在OrderDetail表中插入若干条记录。因为Order表中的ID是自动增长型的字段,那么我们在记录正式插入到数据库之前无法事先得知它的取值,只有在更新后才能知道数据库为它分配的是什么值,然后再用这个ID作为OrderDetail表的OrderID的值,最后更新OderDetail表。但是,为了确保数据的一致性,Order与OrderDetail在更新时必须在事务保护下同时进行,即确保两表同时更行成功,这个就会有点困扰。


解决这类问题常见的主要有两类方法:


一种是微软在网上书店里使用的方法,使用了四个存储过程。改装一下,使之符合现在的例子


--存储过程一


CREATE PROCEDURE InsertOrder

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    @Id                INT = NULL OUTPUT,

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    @OrderDate        DATETIME = NULL,

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    @ProductIDList     NVARCHAR(4000) = NULL,

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    @NumList          NVARCHAR(4000) = NULL,

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    @PriceList          NVARCHAR(4000) = NULL

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

AS

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    SET NOCOUNT ON

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    SET XACT_ABORT ON

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    BEGIN TRANSACTION

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

   --插入主表

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    INSERT Orders(OrderDate) select @OrderDate

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

     SELECT @Id = @@IDENTITY

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

      -- 插入子表

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

     IF @ProductIDList IS NOT NULL

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

            EXECUTE InsertOrderDetailsByList @Id, @ProductIdList, @numList, @PriceList

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    COMMIT TRANSACTION

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    RETURN 0

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

--存储过程二

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

CREATE PROCEDURE InsertOrderDetailsByList

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    @Id        INT,

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    @ProductIDList     NVARCHAR(4000) = NULL,

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    @NumList      NVARCHAR(4000) = NULL,

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    @PriceList      NVARCHAR(4000) = NULL

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

AS

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    SET NOCOUNT ON

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    DECLARE @Length INT

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    DECLARE @FirstProductIdWord NVARCHAR(4000)

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    DECLARE @FirstNumWord NVARCHAR(4000)

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    DECLARE @FirstPriceWord NVARCHAR(4000)

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    DECLARE @ProductId INT

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    DECLARE @Num INT

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    DECLARE @Price MONEY

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    SELECT @Length = DATALENGTH(@ProductIDList)

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    WHILE @Length 0

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

    BEGIN

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

        EXECUTE @Length = PopFirstWord @@ProductIDList OUTPUT, @FirstProductIdWord OUTPUT

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

        EXECUTE PopFirstWord @NumList OUTPUT, @FirstNumWord OUTPUT

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

 &n

来源:https://www.tulaoshi.com/n/20160129/1498431.html

延伸阅读
标签: Web开发
代码如下: var arr1 = [ "one", "two", "three", "four", "five" ]; $.each(arr1, function(){ alert(this); }); 输出:one two three four five 代码如下: var arr2 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] $.each(arr2, function(i, item){ 参数的名字可以自己定义,each方法会根据第一个参数(arr2)的格式而判断回调函数方法体...
1、(int)是一种类型转换;当我们从int类型到long,float,double,decimal类型,可以使用隐式转换,但是当 我们从long类型到int类型就需要使用显式转换,否则会产生编译错误。 2、int.Parse()是一种类容转换;表示将数字内容的字符串转为int类型。 如果字符串为空,则抛出ArgumentNullException异常; 如果字符串内容不是数字,则抛出FormatExcep...
假如你有一个 Integer 对象的列表,并且你想使用 Coolections.sort 来对它们进行排序。另外,你还要自己指定一个比较器,因为你想按降序而不是升序排列它们。这里有一些代码示例说明了该怎么做: import Java.util.*; public class LocalDemo1 { // 使用实现了 Comparator 的匿名类排序。 static void...
卡西欧电子表怎么调时间  卡西欧的电子表一向都是功能别强大的,而且还美观时尚,价格也是那种比较低廉的,是人们比较喜欢的手表品牌之一,但是这个卡西欧电子表怎么调时间一直都是一个难题,困扰着很多的人,下面就让图老师来教大家这个卡西欧电子表怎么调时间吧。 在计时模式下:(数显时间) 1.按住左上不动约三秒,手表显示TYO在闪烁,...
标签: 增肥
1、进食含碳水化合物丰富的食物 在保证摄取足够的蛋白质的情况下,应该多进食含脂肪、碳水化合物较丰富的食物。这样才可以将多余的能量转化成为脂肪储存在皮下。 2、适当高脂食物 日常可以多吃一些五花肉、带皮的猪脚等高脂肪食物,吃鸡肉吃鱼肉的时候要连皮一起吃,尤其是深海鱼和冬天的鱼,它们的皮下脂肪非常的丰富。同...

经验教程

707

收藏

65
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部