Wpis z mikrobloga

Mam taką bazę danych:
https://pastebin.com/11dBhNE7

Generalnie chodzi o to, że jeden "pocket" może przechowywać wiele "itemów"

Przykładowa baza danych:

item:
1, 'A1', None
2, 'A2', None
3, 'A4', None

pocket:
1, 'N1'
2, 'N2'

Problem 1 jest taki, że jak zrobię:

c.execute(UPDATE item SET pocketid = :pid WHERE itemid = :aid",{"aid": 1, "pid":"elo"})
to bez problemu doda "elo' do pola pocket_id, które jest typy INTEGER

Problem 2 jest taki, że jak zrobię:
c.execute("SELECT * FROM item JOIN pocket")
return c.fetchall()

to dostanę:
(1, 'A1', 'elo', 1, 'N1')
(1, 'A1', 'elo', 2, 'N2')
(2, 'A2', None, 1, 'N1')
(2, 'A2', None, 2, 'N2')
(3, 'A4', None, 1, 'N1')
(3, 'A4', None, 2, 'N2')

zamiast zbioru pustego, bo przecież klucz FOREIGN KEY z tabeli item nie zgadza się z żadnym polem pocket
?

używam: #python #sql #sqlite
  • 7
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@scorpio18k:
Foreign Key pozwala zamodelować zależność wartosci danego pola od wartości z innej tabeli i zbudować powiązanie (a wiec moze rzucic błedem jesli docelowa tabela nie ma odpowiadającej wartosci).
W praktyce optymalizator bazy danych bedzie mogl tez skorzystac z FK przy budowie zapytan. Do tego jednak przydaje się jeszcze indeks na takiej kolumnie itd. itp.

Teraz mam zadanie dla Ciebie:
- pomyśl chwilę dlaczego Twoje założenie o tym, że automatycznie po FK system
  • Odpowiedz
@YogiYogi: @scorpio18k: tak samo np. masz tabelę z lotami i tabelę z lotniskami
dany lot ma swój numer, datę, lotnisko startu (FromAirport) i lotnisko lądowania ToAirport, np.
LO26, 20220420, WAW, JFK i zarówno pole FromAirport jak i ToAirport jest kluczem obcym wskazującym na tabelę przechowującą dane o lotniskach
  • Odpowiedz