2016-11-06 69 views
0

编辑:答案是您必须在每次连接时启用外键。 SQLiteCommand command = new SQLiteCommand("PRAGMA foreign_keys = ON"SQLite - 在WHERE NOT EXISTS语句中使用多个无关联的值语句

我看了所有的地方,并没有看到一个模拟我的问题,所以如果有一个答案只是指向我这个方向,我会继续前进......

我想创建一个表格,这是另外两个表格之间的关系,它存储另一个表格的值。

比方说,创建表的语句是:

CREATE TABLE First (FirstID Integer PRIMARY KEY, Name Text, otherThing Text) 

CREATE TABLE Second (SecondID Text PRIMARY KEY, OtherStuff VarChar(10)) 

CREATE TABLE Third (FirstID Integer, SecondID Text, SomeData Text, 
    FOREIGN KEY (FirstID) REFERENCES First(FirstID), 
    FOREIGN KEY (SecondID) REFERENCES Second(SecondID), 
    PRIMARY KEY (FirstID, SecondID)) 

我想要做的就是创建一个INSERT语句,只允许插入三时FirstID存在于第一和SecondID存在在第二。

任何帮助我可以尝试?我试过的(并且失败的)语法是:

INSERT INTO Third (FirstID, SecondID, SomeData) SELECT 123, "foo", "Interesting Data Here" WHERE EXISTS (SELECT FirstID FROM First AND SELECT SecondID FROM Second) 

INSERT INTO Third (FirstID, SecondID, SomeData) SELECT 123, "foo", "Interesting Data Here" WHERE EXISTS (SELECT FirstID FROM First) AND WHERE EXISTS(SELECT SecondID FROM Second) 

回答

0

外键约束已经禁止无效ID。

但是,如果您想默默忽略不存在ID的行,则必须手动检查。 你的第二个查询是正确的,但不能有一个以上的WHERE子句:

INSERT INTO Third (FirstID, SecondID, SomeData) 
SELECT 123, 'foo', 'Interesting Data Here' 
WHERE EXISTS (SELECT 1 FROM First WHERE FirstID = 123) 
    AND EXISTS (SELECT 1 FROM Second WHERE SecondID = 'foo'); 
+0

外键约束被不禁止像我想的那样是不是其他表中的条目。我会尝试你的,看看它需要我 – Fiend394

+0

然后你[没有启用它们](http://stackoverflow.com/questions/9937713/does-sqlite3-not-support-foreign-key-constraints/9937992#9937992) 。 –

+0

经过一番搜索,我找到了答案。谢谢。我不知道你必须在每次连接时启用外键。 SQLiteCommand command = new SQLiteCommand(“PRAGMA foreign_keys = ON”.... etc等 感谢您的帮助,我很困惑。 – Fiend394