我(将)有数十万条记录,其中我插入一次,永远不会更新,其中许多行保持相同的previousId。我可以保证开始/结束指数吗?其中我在table_c中用事务插入X行,并将开始和结束(或开始和长度或结束和长度)写入table_b而不是让每行保持table_b ID?
如果是这样我怎么写SQL?我在想
begin transaction
insert XYZ rows into tbl_c
c_rowId = last_insert_rowid
insert table_b with data + start=c_rowId-lengthOfInsert, end=c_rowId;
commit; end transaction
这会像我期望的那样起作用吗?
答案 0 :(得分:3)
看起来你想要的是一个自动编号列。在大多数DBMS中,您可以将此列定义为表定义的一部分,它将自动对行进行编号。您可以使用函数来获取插入的最后一行的ID;在SQL Server(T-SQL)中,您可以使用SCOPE_IDENTITY()函数。如果ID -have-是某个值或值范围,您可能需要手动执行并使用锁定提示来防止另一个并发事务修改标识符信息。
答案 1 :(得分:1)
您可以使用tablockx锁定sql server中的完整表。
所以:
begin the transaction,
select max(txnid) from table with (tablockx) -- now the table is locked
--figure out how many more you are going to insert
lastId = maxNum + numToInsert
set allow insert auto_increment on insert -- not sure what this is
while (moreToInsert)
insert int table (id,x,y) values (id+1,'xx','yy')
commit transaction
但问题在于它完全锁定了表格。自动递增列(auto_increment(mysql)或identity mssql)可能是您真正想要的,并且不会限制对整个表的访问。 (这在另一个答案中有所说明)