我有一个没有主键的events
表,但是id列是唯一的(我不能改变表结构)。
id|name
_______
1 | a
2 | b
3 | c
我想运行此查询以插入新行
insert into event (id, name) values ((select max(id) + 1 from event), 'd')
我写了这段代码
var evn_event= _unitOfWork.EventRepository.GetQueryableAsync();
long EVENT_CNT = evn_event.Max(x => x.EVENT_CNT)+1;
var entity = new EVENT
{
id = EVENT_CNT,
name = 'd',
};
var result = _unitOfWork.EventRepository.InsertAsync(entity, autoSave: true);
使用此代码,有时我会因为输入的id值不唯一而出现异常(因为在select max id和insert之间的间隔中插入了一条记录)。
问题:如何编写此查询的相等代码
insert into event (id, name) values ((select max(id) + 1 from event), 'd')
select max(id)+1
运行同步插入语句?
2条答案
按热度按时间c7rzv4ha1#
有一个更好的选择来删除上述过程,你必须改变表结构,这样你就不必手动填充ID.执行到SQL服务器.
然后,您可以将插入记录逻辑修改为
laawzig22#
使用此代码,有时我会因为输入的id值不唯一而出现异常(因为在select max id和insert之间的间隔中插入了一条记录)。
实际上,你得到了正确的异常,因为你错过了序列。在这种情况下,对于第一次插入,你总是会得到异常,因为当使用Max时,它需要序列,但在开始时不会有任何值,为了克服这个问题,你将需要descencing你的列表,并必须检查是否返回null。第一次它将为null,可以使用ternary operator.处理
让我们看看实际操作:
假设我有以下模型:
控制器:
**注意:**我使用
null ? 0
三进制来处理第一次插入时的null,因为它在开始时将为null。输出: