0

我有一个名为 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));
4

1 回答 1

0

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

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

现在您不能再插入重复的 HostID/ScanID 对。

一个用于测试的 SQLfiddle

如果你只是说它ScanID需要是唯一的,你可以在它上面创建唯一索引,数据库将强制ScanID不能插入两行相同的行;

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
);
于 2013-08-01T20:41:09.803 回答