2015-08-07 31 views
8

Ho seguente tabella:Comportamento di inserimento e upsert in KDB

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

dove 's' è una chiave primaria e col 'id' è di tipo generale. mi sto cercando di capire seguente comportamento quando si inserisce una lista nella colonna 'id' (stringa in questo es.):

a) upsert funziona, ma inserimento non riesce

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

b) Inserire richiede chiave primaria per essere anche arruolato:

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

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

Cosa succede dietro la scena?

+2

La risposta di Charlie su Google Forum è azzeccata, per chiunque sia interessato: https://groups.google.com/forum/#!topic/personal-kdbplus/JxPLxlmIzJs (risposta il 10 agosto) –

risposta

1

Credo che il problema sia con "gg" - è un elenco in modo che l'inserto sia confuso se si sta tentando di inserire un record o più. Questo:

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

funziona bene. Purtroppo non so altra soluzione, ma dare insert una lista di record di lunghezza:

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

Non sono sicuro di cosa succede con upsert, ma che potrebbe avere qualcosa a che fare con la sua attuazione attraverso modificare: .[;();,;]

+0

Grazie Alexander. So già di cosa hai menzionato. Sto cercando di capire i casi sopra citati. Prova i seguenti casi per ottenere più informazioni: 1) Se la tua tabella non è vuota, allora 't insert (' a; "gg"; 4) funziona. 2) Cambia il tipo di dati della colonna 'id' e 'id2', quindi seguirà il lavoro: 't insert (' a; 4; "gg"). Anche se si guarda al caso b, non è necessario arruolarlo tutti. Solo la prima chiave primaria (anche se si hanno più chiavi primarie) e la lista generale ("gg" in questo caso). Quindi molte cose stanno accadendo dietro la scena che non è adeguatamente documentata su wiki o altri link. – Rahul

+0

Una cosa che ho notato è che se una colonna viene dichiarata come lista generale riceve effettivamente il suo tipo dal primo inserimento, quindi 'meta' dopo aver inserito' (a; 1; 1) 'dirà che la seconda colonna è int. Immagino che la deduzione di tipo fallisca quando una lista viene vista sul primo inserimento. Spesso inserisco un record fittizio in tabelle come quella con '::' null in tutte le colonne generiche. –

+0

Sì, generalmente la colonna riceve il suo tipo dal primo inserimento nel caso in cui sia un inserto a riga singola. Ma non penso che sia l'unica cosa che causa il problema qui. Prova questo: q) t: ([s: 'symbol $()] id:' int $(); id2 :()]/id switch e id2 col tipo di datazione q) 't insert (' a; 4; " gg ")/funziona. Quindi in questo caso inserisce "gg" di seguito. – Rahul