2

私はPythonでsqlite3を使用しています。それぞれにid列を持つ2つのテーブルがあります。テーブル内のこれらのid列は、異なる値を持つことができます。最初の2つのテーブルのid列の値を組み合わせて、値のみを含めることができる列idを持つ新しいテーブルを作成したいと思います。テーブルのいずれかを使用して外部キー(リンク)を正常に作成できますが、両方を使用することはできません。また、2つのテーブルから結合ビューを作成し、3番目のテーブルを結合にリンクしようとしましたが、機能しませんでした。

4

1 に答える 1

1

トリガーを使用して、2つの異なるテーブルの列の和集合に外部キーに相当するものを作成できます。制約付きテーブルでの挿入と更新、および参照テーブルでの更新と削除のトリガーを作成する必要があります。何も見逃していない場合は、合計6つのトリガーが必要になります。

sqliteが外部キーの適用を開始する前に作成されたとおりに作成者がその方法を説明しているこのリンクを参照してください。

http://www.sqlite.org/cvstrac/wiki?p=ForeignKeyTriggers

たとえば、これは、制約付きテーブルがfooであり、参照テーブルがbar1とbar2`である制約付きテーブルのINSERTトリガーになります。

pragma foreign_keys=on;

create table bar1 (id integer primary key);
create table bar2 (id integer primary key);

insert into bar1 values (1);
insert into bar1 values (2);
insert into bar2 values (2);
insert into bar2 values (3);

create table foo (id integer);

CREATE TRIGGER fk_insert_foo
BEFORE INSERT ON foo
    FOR EACH ROW 
    BEGIN
      SELECT RAISE(ROLLBACK, 'insert on table foo violates foo.id '
                             + 'constraint on union of bar1.id and bar2.id')
      WHERE NOT (EXISTS (SELECT * FROM bar1 WHERE bar1.id=NEW.id)
                 OR 
                 EXISTS (SELECT * FROM bar2 WHERE bar2.id=NEW.id));
    END;

insert into foo values (1);
insert into foo values (2);
insert into foo values (3);
select * from foo;
insert into foo values (4); # <<<<<< this fails
于 2012-04-07T15:43:33.940 に答える