【发布时间】:2018-12-02 15:10:44
【问题描述】:
请考虑以下查询 -
DELIMITER $
BEGIN NOT ATOMIC
IF (Select count(*) from t1 where name = 'test') = 0 THEN
INSERT into t1(categoryId,name, language)
values
(NextVal(categorySequence),'test','en-US'),
(LastVal(categorySequence),'test','de-DE');
END IF ;
END $
DELIMITER ;
我想插入 2 条具有相同“categoryId”的记录。要生成 categoryId,我使用 mariadb 序列https://mariadb.com/kb/en/library/sequence-overview/。 NextVal() 返回下一个序列号,LastVal() 返回最后一个序列号(与 NextVal() 函数相同)。如果 INSERT 语句顺序从左到右(我在测试中找到),则上述查询工作正常。示例:“insert into x values('1'), ('2')”。 '1' 将首先插入'2',但我不确定 mariadb 是否会始终遵循此顺序。请帮助我了解 INSERT 订单或建议我一些不同的查询。
【问题讨论】:
-
这有什么关系?什么是主键?
-
主键是 categoryId + 语言(复合键)-插入语句中缺少语言列。 INSERT into t1(categoryId,name,language) values(NextVal(categorySequence),'test','en-US'), (LastVal(categorySequence),'test','de-DE');
-
那么问题是什么?您是否担心
LastVal()可能会在NextVal()之前执行? -
是的,没错。我担心你上面提到的“LastVal() 可能在 NextVal() 之前执行”。