首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

MSSQL 與 SQLite 中 IF NOT EXISTS 判斷邏輯寫法對比

     編輯:關於SqlServer

核心概念

  • IF NOT EXISTS:若查詢結果為空 (不存在),則執行後續語句。
  • IF EXISTS:若查詢結果非空 (存在),則執行後續語句。

MSSQL (T-SQL) 常用判斷模式

1. 判斷數據庫是否存在

IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'database_name')
BEGIN
    CREATE DATABASE database_name;
END

2. 判斷表是否存在

IF NOT EXISTS (
    SELECT * FROM sysobjects 
    WHERE id = OBJECT_ID('table_name') 
      AND OBJECTPROPERTY(id, 'IsUserTable') = 1
)
BEGIN
    CREATE TABLE table_name (...);
END

3. 判斷列是否存在

IF NOT EXISTS (
    SELECT * FROM syscolumns 
    WHERE id = OBJECT_ID('table_name') 
      AND name = 'column_name'
)
BEGIN
    ALTER TABLE table_name ADD column_name INT;
END

4. 判斷記錄是否存在並條件插入 (Upsert 模式)

-- MSSQL 寫法:先判斷不存在,再插入
IF NOT EXISTS (SELECT 1 FROM [t_Table] WHERE [fName] = N'張三')
BEGIN
    INSERT INTO [t_Table] ([fName]) VALUES (N'張三');
END

SQLite 寫法差異

SQLite 不支持 IF NOT EXISTS 作為獨立控制流語句,但支持在 DDL 中使用 IF NOT EXISTS 子句,以及在 DML 中用 WHERE NOT EXISTS 子查詢實現條件插入。

1. 建表/建庫/建索引時防重複

CREATE TABLE IF NOT EXISTS t_Table (fName TEXT);
CREATE INDEX IF NOT EXISTS idx_name ON t_Table(fName);

2. 條件插入:記錄不存在才插入

-- SQLite 寫法:INSERT ... SELECT ... WHERE NOT EXISTS
INSERT INTO [t_Table] ([fName]) 
SELECT '張三'
WHERE NOT EXISTS (SELECT 1 FROM [t_Table] WHERE [fName] = '張三');

兩者對比總結

場景MSSQL (T-SQL)SQLite
判斷對象存在性 (DB/表/列)IF NOT EXISTS (SELECT ... 系統表) BEGIN ... ENDDDL 子句: CREATE ... IF NOT EXISTS
條件插入數據IF NOT EXISTS (SELECT ...) BEGIN INSERT ... ENDINSERT ... SELECT ... WHERE NOT EXISTS (SELECT ...)
系統表查詢sys.databases, sysobjects, syscolumnssqlite_master, pragma_table_info
控制流支持完整支持 IF/BEGIN/END/ELSE無過程化控制流,僅支持 DDL 子句

最佳實踐建議

  1. MSSQL:習慣用 OBJECT_ID('table_name') IS NOT NULL 判斷表存在,更簡潔:
    IF OBJECT_ID('dbo.t_Table', 'U') IS NULL CREATE TABLE ...
  2. SQLite:盡量利用 CREATE IF NOT EXISTS 和 INSERT ... WHERE NOT EXISTS 避免應用層邏輯判斷。
  3. 高併發場景下,單純 IF NOT EXISTS ... INSERT 存在競態條件,建議加唯一約束 + TRY...CATCH (MSSQL) 或 INSERT OR IGNORE (SQLite)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved