說我下面的表格有:關係表
create table foo (
id integer primary key,
mode integer not null check (mode in (1, 2))
);
現在我想存儲有關從該表中記錄更多的信息,但只有那些有,比方說,mode = 1
。我想我可以做到這一點的方法如下:
create table foo_bar (
id integer primary key,
foo_id integer,
_mode integer not null default (1) check (_mode = 1),
foreign key (foo_id, _mode) references foo(id, mode)
);
也就是說,我們在foo_bar
僞列,它是強制始終等於1,包括外鍵約束與foo
。
但是,這不僅不起作用(使用pragma foreign_keys = ON;
),但是當您向foo
插入多個值時,可能會違反外鍵約束!
sqlite> insert into foo(mode) values (1);
sqlite> insert into foo(mode) values (2);
sqlite> select * from foo;
1|1
2|2
sqlite> insert into foo_bar(foo_id) values (1);
Error: foreign key mismatch - "foo_bar" referencing "foo"
sqlite> insert into foo_bar(foo_id) values (2);
Error: foreign key mismatch - "foo_bar" referencing "foo"
sqlite> insert into foo(mode) values (1), (2);
Error: foreign key mismatch - "foo_bar" referencing "foo"
這是SQLite中的錯誤(我使用3.17,它很重要),還是我做錯了?
另外一種方式,沒有外鍵,可能是使用觸發器:
create trigger bad_mode
before insert on foo_bar when (select mode from foo where id = NEW.foo_id) <> 1
begin
select raise(fail, "Invalid mode");
end;
...但是這似乎有點噁心了!
有用的知道......儘管如此,我仍然試圖將問題正常化!謝謝 :) – Xophmeister