插入SQLite3并自行检查

时间:2013-08-01 20:34:08

标签: sqlite insert

我有一个名为scanHistory的表,它将scanID和HostID保存为外键,它们实际上是各自表的主键。我想在SQLite中编写一个插入查询,以避免将scanID的相同值插入到其各自的HostID中,这意味着没有两个相同的主机可以具有相同的scanID,如:

ScanID - 100 HostID - 1
ScanID - 100 HostID - 2
ScanID - 200 HostID - 1

我试过了这个查询

INSERT INTO scanHistory (NULL,4000,1) Select 1 WHERE NOT EXISTS (SELECT 1 from scanHistory);

但它给了我错误陈述

Error: near "NULL": Syntax Error

我做错了什么?该表看起来像这样

CREATE TABLE scanHistory(
ScanHistoryID INTEGER PRIMARY KEY AUTOINCREMENT,
HostID INTEGER REFERENCES host(HostID),
ScanID INTEGER REFERENCES scan(ScanID));

1 个答案:

答案 0 :(得分:0)

让数据库强制执行它怎么样?

CREATE UNIQUE INDEX ix_scan_host ON ScanHistory(ScanID, HostID);

现在您无法再插入重复的HostID / ScanID对。

An SQLfiddle to test with

如果您只是意味着ScanID必须是唯一的,那么您可以在其上创建唯一索引,并且数据库将强制执行不能插入具有相同ScanID的两行; < / p>

CREATE UNIQUE INDEX ix_scan_host ON ScanHistory(ScanID);

如果您在尝试插入值时想要返回错误,请像往常一样使用INSERT INTO...。如果您想忽略该错误,请使用INSERT OR IGNORE INTO...

编辑:要仅使用SQL,您可以使用;

INSERT INTO ScanHistory (ScanID, HostID) SELECT 100, 1 
WHERE NOT EXISTS (
   SELECT 1 FROM ScanHistory WHERE ScanID=100 AND HostID=1
);