我目前正在做一项研究,并想知道目前有什么方法或算法来管理多用户数据插入到两个关系表(通过主键和外键相关)。
在主键表中,
在外键表中
目前我是这样做的。
我担心的是,市场上有哪些替代方案?
发布于 2014-11-20 17:10:08
如果我正确理解了您的问题,您将关注如何确定您需要在子记录中使用的刚刚插入的父记录标识值。实现这一点有几种方法(我假设这里讨论的是DB2 for Linux和Windows和DB2,因为您没有指明您的DB2版本和平台)。
如果使用IDENTITY属性定义父PK列,则可以使用内置函数IDENTITY_VAL_LOCAL()引用刚刚生成的标识值。
如果使用SEQUENCE生成键值,则在插入父表和子表的PREVIOUS VALUE FOR myseq时将使用引用NEW VALUE FOR myseq。
最后,您可以使用名为“数据更改表引用”的特性,它允许您获得DML语句的结果:
SELECT yourpk_column FROM FINAL TABLE ( INSERT INTO yourparent_tab... )您甚至可以用一个语句插入父表和子表(在本例中,person.person_id被定义为IDENTITY):
WITH parent (person_id) AS (
SELECT person_id FROM FINAL TABLE (
INSERT INTO person (first_name, last_name) VALUES ('John', 'Doe')
)
)
SELECT * FROM NEW TABLE (
INSERT INTO person_phone (person_id, type, number)
SELECT person_id, 'Office', '555-555-1234' FROM parent
UNION ALL
SELECT person_id, 'Home', '555-555-6789' FROM parent) 发布于 2014-11-21 17:56:04
正如其他人所说,您可以使用DBMS提供的标识。
但是,如果您希望使用自己的计数器,但同时也计划并发进程,那么您可以采取两种方法:锁定正在更新的计数器,或者再次检查没有其他进程更新它,如果更新了,则重试。
要锁定你可以选择..。对于更新(选择,同时将并发模式设置为UPDATE)。这将允许您从游标读取值,更新当前行,并将记录锁定在读取和更新之间。您将希望在更新之后立即释放锁;因此,如果插入因某种原因失败,您将得到一些从未使用过的序列号(这通常不是问题)。
另一种方法是生成GUID类型的值(虽然时间戳可能足够好),并在递增序列号时进行更新。当您获取时,您可以再次检查GUID没有更改。如果有,这意味着另一个进程进行了更新。所以你得再试一次。
希望这说明了为什么把艰苦的工作留给DBMS会更容易。OTOH,它没有看上去那么复杂,使用自己的计数器有实际的好处。
发布于 2014-11-20 18:12:21
使用“计数器”表来跟踪您所描述的一个或多个ID是一种设计模式,通常会导致计数器表中的行的争用非常高,并发性问题也会很大,即使新的密钥生成率较低。
DBMS很久以前就用标识列(又称“自动增量”)和/或序列解决了这个问题。
即使使用标识或序列,当列上存储这些值的索引时,也可能以非常、非常高的插入速率遇到并发问题。标识和序列通常是单调的,因此您可能会陷入一种情况,即在存储这些值的列的“最高”索引页上写入争用会导致并发问题。
https://stackoverflow.com/questions/27035470
复制相似问题