确定记录是否存在的最快方法

正如标题所示……我试图找出开销最小的最快方法来确定表中是否存在记录。

查询样例:

SELECT COUNT(*) FROM products WHERE products.id = ?;


vs


SELECT COUNT(products.id) FROM products WHERE products.id = ?;


vs


SELECT products.id FROM products WHERE products.id = ?;

假设?'TB100'交换…第一个和第二个查询都将返回完全相同的结果(例如…1为这个对话)。最后一个查询将像预期的那样返回'TB100',如果表中不存在id则不返回。

其目的是找出id是否在表中。如果不是,程序将接下来插入该记录,如果是,程序将跳过它或基于此问题范围之外的其他程序逻辑执行UPDATE查询。

哪个更快,开销更少?(每次运行程序都会重复数万次,并且每天会运行多次)。

(从Java通过M$提供的JDBC驱动程序对M$ SQL Server运行此查询)

590602 次浏览

SELECT TOP 1 products.id FROM products WHERE products.id = ?;将优于你的所有建议,因为它将在找到第一条记录后终止执行。

没有什么能打败

SELECT TOP 1 1 FROM products WHERE id = 'some value';

你不需要计数来知道表中是否有数据。不必要的时候不要使用别名。

EXISTS(或NOT EXISTS)是专门为检查是否存在某些东西而设计的,因此应该是(并且是)最佳选项。它将在匹配的第一行停止,因此它不需要TOP子句,并且它实际上不选择任何数据,因此在列大小方面没有开销。你可以安全地在这里使用SELECT * -与SELECT 1SELECT NULLSELECT AnyColumn没有区别…(你甚至可以使用像SELECT 1/0这样的无效表达式,它不会崩溃)

IF EXISTS (SELECT * FROM Products WHERE id = ?)
BEGIN
--do what you need if exists
END
ELSE
BEGIN
--do what needs to be done if not
END
create or replace procedure ex(j in number) as
i number;
begin
select id into i from student where id=j;
if i is not null then
dbms_output.put_line('exists');
end if;
exception
when no_data_found then
dbms_output.put_line(i||' does not exists');


end;

我过去使用过这个,它不需要全表扫描来查看是否存在某些东西。它超级快……

UPDATE TableName SET column=value WHERE column=value
IF @@ROWCOUNT=0
BEGIN
--Do work
END
SELECT COUNT(*) FROM products WHERE products.id = ?;

这是适用于所有数据库的跨关系数据库解决方案。

SELECT CASE WHEN EXISTS (SELECT TOP 1 *
FROM dbo.[YourTable]
WHERE [YourColumn] = [YourValue])
THEN CAST (1 AS BIT)
ELSE CAST (0 AS BIT) END

此方法为您返回一个布尔值。

你也可以使用

 If EXISTS (SELECT 1 FROM dbo.T1 WHERE T1.Name='Scot')
BEGIN
--<Do something>
END


ELSE
BEGIN
--<Do something>
END
下面是确定数据库中是否存在记录的最简单和最快的方法 好的事情是它在所有关系DB

中工作
SELECT distinct 1 products.id FROM products WHERE products.id = ?;

不要认为任何人都没有提到它,但是如果你确定下面的数据不会改变,你可能还想应用NoLock提示,以确保它在读取时不会被阻止。

SELECT CASE WHEN EXISTS (SELECT 1
FROM dbo.[YourTable] WITH (NOLOCK)
WHERE [YourColumn] = [YourValue])
THEN CAST (1 AS BIT)
ELSE CAST (0 AS BIT) END

MySQL支持LIMIT子句来选择有限数量的记录,而Oracle使用ROWNUM。

对于MySql,你可以像下面这样使用LIMIT (PHP示例显示)

  $sql = "SELECT column_name FROM table_name WHERE column_name = 'your_value' LIMIT 1";
$result = $conn->query($sql);
if ($result -> num_rows > 0) {
echo "Value exists" ;
} else {
echo "Value not found";
}

SQL server 2012+

SELECT IIF((SELECT TOP 1 1 FROM dbo.[YourTable] WHERE [YourColumn] = [YourValue]) IS NULL, 0, 1)