我有一个包含1列的表,我想检查10,000个可用行之间的值的重复。
我想我有两个选择:
使用SELECT
语句进行查询,如下所示:
Var = Query('SELECT * FROM Table WHERE
Field1="VALUE"');
if (Var <> null)
MessageBox("This value exists in the table");
将我的列设置为Primary Key
并使用INSERT
语句,如下所示:
try {
Var = Query('INSERT INTO Table(Field1) VALUES("VALUE")');
}
catch {
MessageBox("This value exists in the table");
}
哪个更快?
答案 0 :(得分:1)
我建议使用select count:
Var = Query('SELECT count(*) FROM Table WHERE Field1="VALUE"');
if (Var > 0) MessageBox("This value exists in the table");
第二种方法不太好,IMO,它可能会慢得多。 顺便说一句,它应该读取存在而不是存在: - )
答案 1 :(得分:1)
这里没有一般性答案,这取决于您的架构的设置方式。在大多数(可能是所有?)关系数据库中,将字段设为Primary Key
将自动在该字段上创建索引。对索引进行唯一性检查几乎和在这种情况下一样快。
但是,您可以为自己的字段编制索引,而不会将其声明为表Primary Key
。如果你这样做,SELECT
命令将与INSERT
加上catch方法一样快。更广泛地说,每个表只能有一个Primary Key
,因此使Primary Key
字段不是一个非常强大的解决方案。一旦你想要强制执行唯一性的多个字段,它就会中断(除非你在两个字段中创建一个复合主键......但是我离题了,但这并不强制执行每列唯一性)。
因此,我建议您在字段/列上创建索引,然后使用SELECT
方法查看该值是否已存在。或者,您可以为该字段编制索引并规定它应该是唯一的,没有使其成为Primary Key
,并使用INSERT
加上catch方法。
答案 2 :(得分:1)
如果你想插入一个值,如果它不存在,那么类似下面的内容将是最合适的(虽然可能适用不同的SQL方言):
INSERT INTO Table(Column)
SELECT 'New Value' WHERE NOT EXISTS (SELECT * FROM Table where Column = 'New Value')
然后检查0或1行是否受到影响。
请注意我说的最合适,我没有进行绩效评估。我在谈论最清楚地表达 intent 的代码。通常,这将足够好。只有极少数情况下你才能放弃最能明确表达你意图的代码,因为那些不那么清晰的代码可以提高0.5%......
您还应该注意您的第一种格式(SELECT * FROM TABLE...
),作为一般风格。如果您正在查询大型宽表,执行此类选择可能会导致数据库执行大量I / O,以检索所有列值,只为您的代码忽略所有这些值。另一方面,EXISTS子句中的SELECT *...
由大多数数据库引擎专门处理,不会检索实际的行/列数据。