我正在研究一个C#程序,该程序在其后带有MariaDB。 因为它可以由多个用户同时运行,所以当使用“ INSERT”语句插入(创建)新行时,我将索引(唯一索引字段)留空,然后由MariaDB分配它们。
问题是,由于我在程序中将索引字段留空,所以我不知道在DB中分配了什么索引号。如果我尝试在客户端上创建索引,则无法保证它在数据库上也是唯一的。
因此,在创建行时是否有办法检索DB分配的索引号?
PS:我正在使用sqlcommandbuilder和sqladapter的更新功能。
答案 0 :(得分:1)
您完全正确:您无法在GUI中定义主键。这样做只会使您陷入种族状况。您需要让数据库生成它(以及任何其他自动值),然后将其返回。
我对Maria DB不了解,所以我只能为您提供与SQL相关的答案:SELECT TOP和SCOPE_IDENTITY都已使用。但是,这些都不是种族条件。但是,SQL OUTPUT clause是什么。检索像PK这样的自动创建的数据就是为了它。它甚至是围绕DML语句的原始Transaction的一部分。
我找不到匹配的“ MariaDB OUTPUT子句”。但是我确实找到了:
该语句的其他选项包括“ INSERT ... SET”语句, “ INSERT ... SELECT”语句以及其他几个选项。
“插入选择”语法最接近于SQL的INSERT ... OUTPUT组合。可以。
编辑:嗯,毕竟MariaDB中的INSERT SELECT似乎并不是您要寻找的机器人:https://mariadb.com/kb/en/library/insert-select/更像是从其他表/导入中批量插入/插入
所以我想,后备方法是创建自己的插入/选择组合,这是手动创建的Transaction的一部分并锁定在表上。
答案 1 :(得分:0)
使用下面的2条sql怎么样?
SELECT MAX(id) FROM mytable.
或
SELECT LAST_INSERT_ID()
会成为另一个比赛条件吗?