| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 601 人关注过本帖
标题:请教如何查询SQL SERVER增加记录的ID值
只看楼主 加入收藏
fanjinyu9108
Rank: 2
等 级:论坛游民
帖 子:704
专家分:20
注 册:2014-1-16
结帖率:88.62%
收藏
已结贴  问题点数:20 回复次数:12 
请教如何查询SQL SERVER增加记录的ID值
我使用SPT的方式在SQL SERVER表A中增加一条记录,还没有保存,现在在保存这条记录之前,我需要获得这条新增记录的ID值,然后在另外一个表B中增加多条记录,这些多条记录关联着前面获取的ID值,将后面表B的某个字段值更新为获取的ID值后,然后一起保存。请问如何获取ID值,(程序是在多用户情况下使用的,所以选择在保存记录前获取ID值)
搜索更多相关主题的帖子: 获取 增加 保存 记录 SQL 
2024-05-25 11:14
fanjinyu9108
Rank: 2
等 级:论坛游民
帖 子:704
专家分:20
注 册:2014-1-16
收藏
得分:0 
关于这个问题,我想做个补充说明,在SQL SERVER里面,A表和B表是一对多的关系,如果表在本地,我可以先增加A表的记录并存盘,提取出A表的ID值,再增加B表的记录,并且把ID值存到B表的字段里面,但是现在是远程网络数据,我必须保证A表的数据和B表的数据要么同时存盘,要么同时回滚(rollback)取消,否则可能出现A表存盘,网络突然中断,B表却没有存盘的情况
2024-05-25 16:44
fanjinyu9108
Rank: 2
等 级:论坛游民
帖 子:704
专家分:20
注 册:2014-1-16
收藏
得分:0 
在SQL Server中,如果想要外键(FK)自动填充,可以在创建或修改表时指定某个列为外键,并设置其为IDENTITY属性。但是,需要注意的是,外键列通常不能直接设置为IDENTITY类型,因为它需要参照另一个表的主键。

如果你想要外键自动填充,通常是指当你插入新行到包含外键的表时,外键列会自动填充为另一个表的相应主键值。这通常通过触发器实现。

以下是一个示例,展示了如何创建一个触发器来在插入新行时自动填充外键:

-- 假设有两个表:Order (主表) 和 OrderDetail (子表)
-- Order 表有一个名为 OrderID 的主键
-- OrderDetail 表有一个名为 OrderID 的外键,需要自动填充
 
-- 创建触发器来在插入OrderDetail新行时自动填充OrderID
CREATE TRIGGER trg_OrderDetail_Insert
ON OrderDetail
AFTER INSERT
AS
BEGIN
  SET NOCOUNT ON;
  UPDATE OrderDetail
  SET OrderID = i.OrderID
  FROM Inserted i
  WHERE OrderDetail.DetailID = i.DetailID; -- 假设DetailID是OrderDetail的主键
END;
 
-- 插入新行到OrderDetail时,只需要指定DetailID和其他相关列,OrderID将自动填充
-- 例如:
INSERT INTO OrderDetail (DetailID, ProductID, Quantity)
VALUES (1, 101, 2);
在这个例子中,OrderDetail表的OrderID列需要在插入新行时自动填充为Order表中对应的OrderID。触发器trg_OrderDetail_Insert会在每次插入操作之后执行,并自动更新OrderDetail表中的OrderID列。

请注意,这只是一个简化的示例,实际使用时需要根据你的数据库结构和需求进行相应的调整。
2024-05-25 17:08
fanjinyu9108
Rank: 2
等 级:论坛游民
帖 子:704
专家分:20
注 册:2014-1-16
收藏
得分:0 
以上是我在网上搜索自动填充,我这种情况可以实现自动填充吗?

2024-05-25 17:09
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:276
专家分:615
注 册:2014-6-12
收藏
得分:20 
以下是引用fanjinyu9108在2024-5-25 16:44:46的发言:

关于这个问题,我想做个补充说明,在SQL SERVER里面,A表和B表是一对多的关系,如果表在本地,我可以先增加A表的记录并存盘,提取出A表的ID值,再增加B表的记录,并且把ID值存到B表的字段里面,但是现在是远程网络数据,我必须保证A表的数据和B表的数据要么同时存盘,要么同时回滚(rollback)取消,否则可能出现A表存盘,网络突然中断,B表却没有存盘的情况

开启SQL事务,执行你需要执行的命令,A、B表都处理完之后,提交事务确认。在提交事务确认之前,如果出现异常,你执行回滚命令,2个表是同时回滚的。这是SQL的机制,不需要你控制。
2024-05-25 19:54
fanjinyu9108
Rank: 2
等 级:论坛游民
帖 子:704
专家分:20
注 册:2014-1-16
收藏
得分:0 
程序代码:
SQLSetprop(nhandle,'Transactions',2)        && 开启远程手工事务
    BEGIN TRANSACTION
    
     
    select c_t  &&表1
    a1=TABLEUPDATE(.t.)
    **Ac3=SQLEXEC(nhandle,"SELECT SCOPE_IDENTITY() AS NewID ","c_id")  &&  现在连接处于打开状态
    Ac3=SQLEXEC(nhandle,"SELECT MAX(id) AS NewID from yksb.dbo.shebei_zl","c_id")  &&  现在连接处于打开状态
     IF  Ac3<0 
       END TRANSACTION  
       = SQLDISCONNECT(nhandle)
       MESSAGEBOX("读取数据错误!",0,"错误信息") 
       RETURN TO MASTER 
     ENDIF
     SELECT c_id
     myid=NewID
     UPDATE c_t2 SET id_zl=myid  &&直接修改中间表
    
    
    select c_t2   &&表2
    a2=TABLEUPDATE(.t.)
    IF a1=.t. AND a2=.t.
     END TRANSACTION  
    ELSE
        rollback  
        *END TRANSACTION
    ENDIF
    SQLSetprop(nhandle,'Transactions',1)        && 开启远程自动事务
    = SQLDISCONNECT(nhandle) &&关闭
    IF a1=.t. AND a2=.t.
      IF  弹出对话=.t.
       MESSAGEBOX("数据保存成功!",0,"信息") 
     endif  
    ELSE
       MESSAGEBOX("数据保存失败!",0,"信息")
       弹出对话=.t. 
       RETURN TO master
    endif 



[此贴子已经被作者于2024-5-26 10:15编辑过]

2024-05-26 09:24
fanjinyu9108
Rank: 2
等 级:论坛游民
帖 子:704
专家分:20
注 册:2014-1-16
收藏
得分:0 
以上是我的代码,我取表A的id值是用“SELECT MAX(id) AS NewID from yksb.dbo.shebei_zl“的语句,这样的方法在多用户状态下会不会取错值,把别人存盘的ID值取回?
2024-05-26 09:29
fanjinyu9108
Rank: 2
等 级:论坛游民
帖 子:704
专家分:20
注 册:2014-1-16
收藏
得分:0 
请师傅们帮忙看看

[此贴子已经被作者于2024-5-26 10:16编辑过]

2024-05-26 09:53
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:276
专家分:615
注 册:2014-6-12
收藏
得分:0 
以下是引用fanjinyu9108在2024-5-26 09:29:23的发言:

以上是我的代码,我取表A的id值是用“SELECT MAX(id) AS NewID from yksb.dbo.shebei_zl“的语句,这样的方法在多用户状态下会不会取错值,把别人存盘的ID值取回?

开启事务时,你操作的表是自动加锁的,别人取不到ID值。
你可以在事务执行中间增加messagebox让程序暂停,在另外一台电脑上或者另外一个VFP9里面去读取ID,试试就明白了
2024-05-26 12:54
fanjinyu9108
Rank: 2
等 级:论坛游民
帖 子:704
专家分:20
注 册:2014-1-16
收藏
得分:0 
谢谢师傅们的解答,我还有一个疑问,就是表A存盘后,在准备操作表B的时候,突然断网了,这时就存在表A存盘了,表B却没有存盘,有这种可能吗?能避免这种情况吗?
2024-05-26 14:21
快速回复:请教如何查询SQL SERVER增加记录的ID值
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043331 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved