IF NOT EXISTS:若查詢結果為空 (不存在),則執行後續語句。IF EXISTS:若查詢結果非空 (存在),則執行後續語句。IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'database_name')
BEGIN
CREATE DATABASE database_name;
END
IF NOT EXISTS (
SELECT * FROM sysobjects
WHERE id = OBJECT_ID('table_name')
AND OBJECTPROPERTY(id, 'IsUserTable') = 1
)
BEGIN
CREATE TABLE table_name (...);
END
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
-- MSSQL 寫法:先判斷不存在,再插入
IF NOT EXISTS (SELECT 1 FROM [t_Table] WHERE [fName] = N'張三')
BEGIN
INSERT INTO [t_Table] ([fName]) VALUES (N'張三');
END
SQLite 不支持 IF NOT EXISTS 作為獨立控制流語句,但支持在 DDL 中使用 IF NOT EXISTS 子句,以及在 DML 中用 WHERE NOT EXISTS 子查詢實現條件插入。
CREATE TABLE IF NOT EXISTS t_Table (fName TEXT);
CREATE INDEX IF NOT EXISTS idx_name ON t_Table(fName);
-- 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 ... END | DDL 子句: CREATE ... IF NOT EXISTS |
| 條件插入數據 | IF NOT EXISTS (SELECT ...) BEGIN INSERT ... END | INSERT ... SELECT ... WHERE NOT EXISTS (SELECT ...) |
| 系統表查詢 | sys.databases, sysobjects, syscolumns | sqlite_master, pragma_table_info |
| 控制流支持 | 完整支持 IF/BEGIN/END/ELSE | 無過程化控制流,僅支持 DDL 子句 |
OBJECT_ID('table_name') IS NOT NULL 判斷表存在,更簡潔:IF OBJECT_ID('dbo.t_Table', 'U') IS NULL CREATE TABLE ...CREATE IF NOT EXISTS 和 INSERT ... WHERE NOT EXISTS 避免應用層邏輯判斷。IF NOT EXISTS ... INSERT 存在競態條件,建議加唯一約束 + TRY...CATCH (MSSQL) 或 INSERT OR IGNORE (SQLite)。