SQLite:使外键唯一

时间:2016-02-07 19:51:03

标签: sqlite

我正在使用SQLite 3.8.11 for Mac OS X app。 我的目标是创建一个表,然后在其他表中引用一些字段。 例如:

CREATE TABLE artist(
  artistid    INTEGER PRIMARY KEY, 
  artistname  TEXT
);
CREATE TABLE track(
  FOREIGN KEY(trackartist) REFERENCES artist(artistid)
);

但是,我想将 trackartist 插入 track ,以便每行包含唯一的 trackartist 价值。如果 trackartist 值已在轨道中,则必须忽略新值。 我怎么能在这个环境中做到这一点? UPDATE或IGNORE命令似乎不起作用,值重复。

2 个答案:

答案 0 :(得分:4)

这是两个独立的问题:FOREIGN KEY仅指定插入的值必须存在于另一个表中,但不指定它在此表中出现的次数。另一方面,UNIQUE约束要求该值在此表中可能不会出现多次。

我不确定“艺术家 - 曲目”模型是否合理,但让我们想象一下,你真的想要指明一个艺术家不能拥有多个曲目。因此,您不仅要指定trackartist引用artist(artistid),还要指定UNIQUE

CREATE TABLE track(
  trackname TEXT,
  trackartist INTEGER UNIQUE,
  FOREIGN KEY(trackartist) REFERENCES artist(artistid)
);

答案 1 :(得分:0)

也许这会起作用?

INSERT OR REPLACE INTO track (trackartist) VALUES '123'
WHERE NOT EXISTS(SELECT 1 FROM track WHERE trackartist="123");

有关详细文档,请参阅here

编辑: 正确的语法如下:

INSERT OR REPLACE INTO track (trackartist) SELECT '123' WHERE NOT EXISTS(SELECT 1 FROM track WHERE trackartist="123");