2015-08-07 48 views
8

mam poniższej tabeli:Zachowanie Insert i upsert w KDB

  q) t:([s:`symbol$()] id:();id2:`int$()) 

gdzie 's' jest kluczem podstawowym i 'id' col ma ogólny typ. Próbuję zrozumieć następujące zachowanie podczas wstawiania listę w 'id' kolumna (ciąg w tym ex.):

a) upsert działa, ale Insert nie

  q) `t insert (`a;"gg";4)  // 'type 
      q) `t upsert (`a;"gg";4)  // works 

b) Włóż wymaga klucz podstawowy być również zarejestrowanym:

q)`t insert (`a;enlist "gg";4) // 'length 

    q)`t insert (enlist `a;enlist "gg";4) // works 

Co dzieje się za sceną?

+2

Odpowiedź Charliego na forach Google jest ważna dla każdego, kto jest zainteresowany: https://groups.google.com/forum/#!topic/personal-kdbplus/JxPLxlmIzJs (odpowiedź z 10 sierpnia) –

Odpowiedz

1

Uważam, że problem polega na "gg" - jest to lista, więc wstawka staje się zagmatwana, niezależnie od tego, czy próbujesz wstawić jeden rekord, czy wiele. To:

`t insert (`a;"g";4) 

działa dobrze. Niestety nie wiem, inne obejście ale dać insert listę rekordów o długości jednego:

`t insert (enlist `c;enlist "gg";enlist 4) 

Nie jestem pewien, co się dzieje z upsert, ale może to mieć coś wspólnego z jego realizacji poprzez zmianę: .[;();,;]

+0

Dzięki Alexander. Już wiem o tym, o czym wspomniałeś. Próbuję rozgryźć wyżej wspomniane przypadki. Wypróbuj następujące przypadki, aby uzyskać większy widok: 1) Jeśli Twoja tabela nie jest pusta, to działa 't insert (' a; "gg"; 4). 2) Przełącz typ danych kolumny "id" i "id2", a następnie działa: 't insert (' a; 4; "gg"). Także, jeśli spojrzysz na przypadek b, nie musimy rejestrować wszystkich. Tylko pierwszy klucz podstawowy col (nawet jeśli masz więcej kluczy podstawowych) i ogólną listę col ("gg" w tym przypadku). Zdecydowanie wiele rzeczy dzieje się za sceną, która nie jest odpowiednio udokumentowana na wiki lub jakimkolwiek innym łączu. – Rahul

+0

Jedną z rzeczy, którą zauważyłem jest to, że jeśli kolumna jest zadeklarowana jako lista ogólna, faktycznie otrzymuje jej typ z pierwszej wstawki, więc 'meta' po wstawieniu' (a; 1; 1) 'powie, że druga kolumna jest int. Przypuszczam, że odliczanie typu nie powiedzie się, gdy lista jest widoczna na pierwszym wstawieniu. Często wstawiam fałszywy rekord do tabel takich jak ten z '' 'nulls we wszystkich ogólnych kolumnach. –

+0

Tak, kolumna generalnie odbiera typ od pierwszej wstawki w przypadku jej wstawienia w jednym wierszu. Ale nie sądzę, że to jest jedyna rzecz, która powoduje problem. Spróbuj tego: q) t: ([s: 'symbol $()] id:' int $(); id2 :()]/przełącznik id i id2 col typ danych q) 't insert (' a; 4; " gg ")/działa. W tym przypadku wstawia "gg" z rzędu. – Rahul