在我生活的这个世界里,建立一个将所有飞镖扔在墙上的解决方案,并希望有些人能够击中牛眼,这是一种非常糟糕的解决方案。
那么,我的问题出现了,何时在惯例可接受的生产系统中使用INSERT IGNORE
?
我有一种情况,我想写一个TRIGGER
(请参阅#17353080)搜索现有数据,如果找不到,那么它是INSERTed
。建议使用INSERT IGNORE
并依赖primary keying
个唯一字段。
所以,我有一个困境:
INSERT IGNORE
并依赖primary keying
我希望保持唯一的字段,没有重复的INSERT INSERT
?由于这些问题太模糊,无法在这个特定的媒体中提问,我想了解使用INSERT IGNORE的时候是否可以接受,我可以根据自己的具体情况做出自己的判断。
谢谢,
马特
元:
我认为,因为conventions
是一个描述为的现有标记:
一个通用标签,涵盖任何可接受的服务方法,其中 可能包括命名,间距,编码,评论等。
此类问题是可以接受的。
答案 0 :(得分:1)
从逻辑上讲,我会说这取决于你在失败时需要做什么。
如果您只是执行批量插入而不关心该值是否已经在表格中 - 只要它仍然是唯一的 - 那么INSERT IGNORE
是明智的。正如该术语所暗示的那样,您很乐意忽略任何未插入的内容。
如果您需要对失败的插件执行某些操作,例如建议您的用户,则需要执行单独的检查。
然而,最重要的问题是:“为什么价值已经在表格中?”
答案 1 :(得分:1)
对我来说,这些“功能”的警钟就是他们的沉默。在计费领域;当您收到多条对您的理解“独特”的记录时;你想知道他们。在电信中,交换机将看到30-100列的记录;其中5个使记录独特;但是,不时进行改变。这里的问题是WAS不再具有的独特性,我们需要了解这一点。
另一个问题是;为什么在生产系统中只是满足于忽略重复是否真的可以?至少;我们会有一个审计表,记录重复记录供某人审查,因为它通常会在数据流中提出某些类型的问题(传入)。
至于性能......对于现代硬件,这真的是一个问题吗?任何进行大规模更新的东西都可能不会是大量客户端交互(可能是后台进程);如果它是客户端交互式,您将有一个数据库服务器设计设置来处理这种情况 - 例如表分区,优先级等。
除此之外; INSERT INGORED的警告使其成为一个可怕的特征:
我当然想知道数据是否为NULL而不应该......
同样,这个命令看起来就像“当时的好东西” - 而且我认为是米老鼠的编程。