Ste*_*eam 25 mysql sql sql-server oracle
我有一个SQL服务器表RealEstate与列 - Id,属性,Property_Value.该表有大约5-10百万行,并且将来可以增加更多.我只想在此表中不存在Id,Property,Property_Value的组合时插入行.
示例表 -
1,Rooms,5
1,Bath,2
1,Address,New York
2,Rooms,2
2,Bath,1
2,Address,Miami
Run Code Online (Sandbox Code Playgroud)
2,Address,Miami不应允许插入.但是,2,Price,2billion没关系.我很想知道这是"最好的"方法,为什么这样做.为什么这部分对我来说最重要.两种检查方式是 -
是否有任何一种情况会比另一种更好?
谢谢.
PS:我知道有一个类似的问题,但它没有回答我的问题 - 唯一约束与预检查 另外,我认为UNIQUE适用于所有数据库,所以我认为我不应该删除mysql和oracle标签.
iva*_*tpr 14
我认为在大多数情况下,这两者之间的差异将足够小,以至于选择应该主要通过选择最初对于第一次查看代码的人来说最容易理解的实现来驱动.
但是,我认为异常处理有一些小优点:
异常处理可避免潜在的竞争条件.如果另一个进程在您的检查和插入之间插入记录,则"检查,然后插入"方法可能会失败.因此,即使您正在进行'检查然后插入',您仍然需要对插入进行异常处理,如果您已经在进行异常处理,那么您也可以取消初始检查.
如果您的代码不是存储过程并且必须通过网络与数据库交互(即应用程序和数据库不在同一个框中),那么您希望避免两个单独的网络调用(一个用于检查和其他用于插入)并通过异常处理进行处理提供了一种通过单个网络调用处理整个事物的简单方法.现在,有很多方法可以执行"检查然后插入"方法,同时仍然避免第二次网络调用,但只是捕获异常可能是最简单的方法.
另一方面,异常处理需要一个唯一约束(这实际上是一个唯一索引),它具有性能权衡:
我还要注意,如果你的实际情况是'更新其他插入'(即如果已经存在具有唯一值的记录,那么你想要更新该记录,否则你插入一个新的记录)然后你真正想要使用的是你的特定数据库的UPSERT方法,如果有的话.对于SQL Server和Oracle,这将是一个MERGE语句.
取决于#1(进行查找)合理的成本,我会做两件事.至少,在Oracle中,这是我最熟悉的数据库.
理由:
COMMIT默认情况下成功(即已编写的更改).