我有两个一对一关系的表。我需要使用未使用的相同主键将信息插入这两个表中。我有第一个表插入到一个简单的插入查询。有没有办法在插入记录后抓取记录的主键并且主键是自动递增的?我认为只添加到第二张表是不安全的,因为有些记录没有第二张表格。
根据用于插入的查询查询底部x值是否安全?
值来自包含字段A,B,C,D,E和F的源表
Table1有字段id1,A,C,E和F,Table2有字段id2,B和D. id1和id2相等但与源表中的id不同
答案 0 :(得分:0)
在您的应用程序代码中生成一个随机的64位整数。使用它作为插入两个表的主键。
如果由于生日悖论导致插入失败,请祝贺您自己,因为您的应用程序非常受欢迎!
(根据维基百科的说法,100,000,000次插入后单次碰撞的几率低于0.1%。问一下,在回避之前的同一时期内,由于某些其他原因导致单个插入失败的可能性为100,000,000这种方法。)
答案 1 :(得分:0)
在SQL Server上的纯TSQL中,您可以使用OUTPUT
子句输出INSERT
的结果。我不知道这是否适用于Access,但我想我会提及它。
例如:
create table Test
(
TestKey int identity(1,1) primary key clustered,
TestValue int
)
insert into Test (TestValue)
output Inserted.*
select 1
union select 2
-- results:
-- TestKey TestValue
-- 1 1
-- 2 2
如果需要,您可以将此输出重定向到表格中。例如:
create table #TempTable
(
TempTableKey int,
TempTableValue int
)
insert into Test (TestValue)
output Inserted.TestKey, Inserted.TestValue
into #TempTable (TempTableKey, TempTableValue)
select 1
union select 2
select * from #TempTable
-- results:
-- TempTableKey TempTableValue
-- 1 1
-- 2 2
答案 2 :(得分:0)
[表1]。[id1]应该是AutoNumber
字段。 [表2]。[id2]应该是Long Integer
字段。执行INSERT到[Table1],使用SELECT @@IDENTITY
检索新创建的AutoNumber值,然后将该值用于[Table2]。[id2],如下所示:
Dim cdb As DAO.Database, rst As DAO.Recordset, sql As String, newId As Long
Set cdb = CurrentDb
' insert one row into [Table1]
sql = "INSERT INTO [Table1] ([A], [C], [E]) VALUES ( ... "
cdb.Execute sql, dbFailOnError
' retrieve the newly-created AutoNumber value
Set rst = cdb.OpenRecordset("SELECT @@IDENTITY", dbOpenSnapshot)
newId = rst(0).Value ' this is the new key value to use for [Table2].[id2]
rst.Close
答案 3 :(得分:0)
这些都是很好的答案,但我最终做的是执行第一个表中的插入,重新获取表单,然后使用vba代码搜索表单的记录集并将值插入表单控件。这允许具有关系的表单查询负责为我插入正确的密钥。