2012-04-07 7 views
2

Ich benutze sqlite3 in Python. Ich habe zwei Tabellen mit ID-Spalte in jedem. Diese ID-Spalten in den Tabellen können unterschiedliche Werte haben. Ich möchte eine neue Tabelle mit Spalten-ID erstellen, die nur die Werte enthalten kann, indem die Werte aus den ID-Spalten der ersten beiden Tabellen kombiniert werden. Ich bin in der Lage, erfolgreich Fremdschlüssel (Verbindung) mit irgendeinem der Tabelle aber nicht mit beiden zu verursachen. Ich habe auch versucht, eine Join-Ansicht aus den beiden Tabellen zu erstellen und versucht, die dritte Tabelle mit dem Join zu verknüpfen, hat aber nicht funktioniert.In sqlite3 Referenz (Fremdschlüssel) eine Spalte einer Tabelle nach Join von zwei Spalten in anderen zwei Tabellen

+0

vielleicht den python-Tag entfernen, da dies wenig damit –

Antwort

1

Mithilfe von Triggern können Sie das Äquivalent eines Fremdschlüssels für die Vereinigung von Spalten aus zwei verschiedenen Tabellen erstellen. Sie müssen Trigger für Einfügungen und Aktualisierungen in der eingeschränkten Tabelle sowie für Aktualisierungen und Löschungen in den Referenztabellen erstellen. Wenn ich nichts verpasse, benötigst du insgesamt sechs Auslöser.

diesen Link sehen, wo der Autor ziemlich erfahren Sie, wie es zu tun, wie es geschrieben wurde, bevor SQLite Fremdschlüssel erzwingen gestartet:

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

Zum Beispiel würde dies die INSERT-Trigger für die sein eingeschränkt Tisch, wo die eingeschränkte Tabelle ist foo und die Referenztabellen sind bar1 und bar2`:

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 
+0

Dank zu tun hat , Es klappt. Allerdings gibt es einen Nachteil in dieser Methode foo Tabelle zeigt keine Verknüpfung mit bar1 und bar2 –

+0

Ich bin meistens bei Ihnen (dh kein ORM erkennt die Verbindung automatisch), aber was ein FK ist für SQLite, dort kann nur eine referenzierte (dh übergeordnete) Tabelle pro FK sein: http://www.sqlite.org/syntaxdiagrams.html#foreign-key-clause –

+0

Ich habe eine neue Tabelle erstellt und einen Code hinzugefügt, um darin automatisch Daten einzufügen oder zu löschen wenn Einfügung oder Löschung von bar1 oder bar2 stattfindet. Dadurch wird diese Tabelle immer aktualisiert und dann mit foo verknüpft. –

Verwandte Themen