C# 如何正确插入标签?SQL

C# 如何正确插入标签?SQL,c#,sql,ado.net,C#,Sql,Ado.net,范例 我正在使用SQLite和C。是否适合 启动交易 插入标签 如果受影响的行数=0,则进行选择以获取tag.PK,否则使用last_insert_rowid 插入项目 或者上述情况会有问题吗?我计划切换到MySql或TSQL,我通常更喜欢: 启动交易 选择“从标记”以确定标记是否已存在 如果不存在,则插入到标记中,并获取生成的id,当然,检查插入是否有效 插入项目 提交事务或在出现错误时回滚 与您建议的唯一区别是,在尝试插入之前,我尝试从标记中选择。为什么?因为我不喜欢做一个最有可能失败的插入

范例

我正在使用SQLite和C。是否适合

启动交易 插入标签 如果受影响的行数=0,则进行选择以获取tag.PK,否则使用last_insert_rowid 插入项目
或者上述情况会有问题吗?我计划切换到MySql或TSQL,我通常更喜欢:

启动交易 选择“从标记”以确定标记是否已存在 如果不存在,则插入到标记中,并获取生成的id,当然,检查插入是否有效 插入项目 提交事务或在出现错误时回滚 与您建议的唯一区别是,在尝试插入之前,我尝试从标记中选择。为什么?因为我不喜欢做一个最有可能失败的插入——至少,如果我在标签的名称上有一个唯一的索引,那么您可能应该这样做


但它可能不会有太大的变化…

我通常更喜欢:

启动交易 选择“从标记”以确定标记是否已存在 如果不存在,则插入到标记中,并获取生成的id,当然,检查插入是否有效 插入项目 提交事务或在出现错误时回滚 与您建议的唯一区别是,在尝试插入之前,我尝试从标记中选择。为什么?因为我不喜欢做一个最有可能失败的插入——至少,如果我在标签的名称上有一个唯一的索引,那么您可能应该这样做


但是它可能不会有太大的改变…

我看到您的设计中唯一的问题是每个项目只能有一个标签。那是你的意图吗


否则,插入过程就可以了。正如Pascal Martin所建议的那样,您只需检查标记是否已经存在。

我发现您的设计中唯一的问题是每个项目只能有一个标记。那是你的意图吗


否则,插入过程就可以了。您只需按照Pascal Martin的建议检查标记是否已经存在。

如果标记不存在,您可以有条件地插入标记,如:

tag  { id PK, name TEXT };
item { id PK, exampleData LONG, tagId LONG //or foreign key depending on provider }
然后,在插入新项目时,可以查询标记id:

insert into tag (name)
select 'NewTagName'
where not exists (select * from tag where name = 'NewTagName')

此方法不需要检索插入行的id,无需事务即可正常工作。

如果标记不存在,可以有条件地插入标记,如:

tag  { id PK, name TEXT };
item { id PK, exampleData LONG, tagId LONG //or foreign key depending on provider }
然后,在插入新项目时,可以查询标记id:

insert into tag (name)
select 'NewTagName'
where not exists (select * from tag where name = 'NewTagName')

此方法不需要检索插入行的id,无需事务即可正常工作。

我认为您的解决方案没有错,我相信它是正确的,请使用它

但是当您切换到MySql或TSql时 使用相同的解决方案

1-先插入 2-返回@插入行的标识ID
…我认为你的解决方案没有错,我相信它是正确的,并使用它

但是当您切换到MySql或TSql时 使用相同的解决方案

1-先插入 2-返回@插入行的标识ID

我忘了写,是的,它是独一无二的。但我被告知永远不要先选择,因为它不是写操作,在我选择后,另一个事务可以插入它,导致插入失败、唯一或不正确的逻辑copy@acidzombie24:但交易将保护您不受此影响。想象一下,如果您正在编写银行应用程序。要将钱从我的帐户转到您的帐户,我必须先选择可用余额。如果余额>=转账金额,则进行转账,否则不进行转账。这同样适用于你的情况。事实上不是。我写了一个测试用例,但失败了。将此粘贴到winform项目中,当我尝试此操作时,web似乎会崩溃。由于信号量,没有竞争条件,正如您所看到的,结果是6而不是7。它们都在一个交易中。我忘了写,是的,它是独一无二的。但我被告知永远不要先选择,因为它不是写操作,在我选择后,另一个事务可以插入它,导致插入失败、唯一或不正确的逻辑copy@acidzombie24:但交易将保护您不受此影响。想象一下,如果您正在编写银行应用程序。要将钱从我的帐户转到您的帐户,我必须先选择可用余额。如果余额>=转账金额,则进行转账,否则不进行转账。这同样适用于你的情况。事实上不是。我写了一个测试用例,但失败了。将此粘贴到winform项目中,当我尝试此操作时,web似乎会崩溃。由于信号量,没有竞争条件,正如您所看到的,结果是6而不是7。它们都在一个事务中。在单个标记上捕捉得很好。通常我允许多个标记,但在这种情况下,我不使用标记,不确定如何插入数据。单个标记捕捉得很好。通常我允许多个,但在这种情况下,我不使用标记,不确定如何插入数据。或者更简单地说:选择“NewData”,id from tag,其中name='NewTagName'被接受,因为这有助于我编写查询和
另外,您没有说先选择哪个是错误的,或者更简单地说:选择'NewData',id from tag where name='NewTagName'接受,因为这有助于我编写查询,而且您也没有说先选择哪个是错误的