上述都不是最佳解决。
对于SQL Server数据库,它提供了两个系统属性供取回最后一次插入时主键值。一个是SCOPE_IDENTITY,另一个是@@IDENTITY。
SCOPE_IDENTITY记住的是在一个应用实例范围内的主键标识。假如插如操作和取主键值的操作使用了不同的连接,则它们处于不同的实例,只能使用@@IDENTITY来获取最后一次插入的主键值。
这里还要提到一点,通常插入操作和取主键值的操作时分开的,@@IDENTITY仅记住最后一次插入操作时产生的主键值,这时应该考虑并发问题,假如你的程序是并发访问数据库,在本实例中插入完毕即将取回@@IDENTITY之间,其他实例可能会执行插入操作,这时候@@IDENTITY取到的就是其他实例插入的主键值。因此这里应该考虑将其作为一个事务来处理。
对于Access的话,会比较棘手。上述方法可以在一定程度上使用,但是都是不完备的(不能保证正确)。还有一种变相的解决办法是,在一个表中除了主键,还有一个或若干列合在一起其值是唯一的,通过这些“候选键”来间接找到主键的值。“候选键”本身就可代表一行,因此它是完备的,并可以正确找到主键,而且也避免了并发问题。
举个例子:假如会员系统用户名要求是唯一的。那么用户名可以作为候选键的一种。当插入成功后,又再通过用户名查询即可查到主键ID的值。虽然它是完备的,但有额外的要求是其有些使用限制,在者就是写程序时会比较繁琐些。