2013-10-03 2 views
1

Je dois faire face à la, je suppose le grand int, les valeurs de la clé primaire 1380742793415240. Dans R je peux facilement ajuster l'option (scipen = 100) mais j'ai besoin de stocker ces données dans postgres db. J'ai déjà essayé de dbWriteTable par défaut (double précision) avec le résultat: violer constaint (probablement dupliquer les clés dans ... 4e + 015 représentation) et aussi après avoir changé la colonne cible à bigint avec le résultat: invalid input syntax for integer: "1.38074279341524e+015".R RgregreSQL bigint type de données

exemple: essayer de sauvegarder et charger de db suivant dt

sample_dt <- data.table(a = c(20130101,20130102,20130102), 
         b = c(1380742793415240,1380742793415241,1380742793415242)) 

Quel est le moyen efficace de sauvegarder et charger ce type de données dans Postgres?

+0

Enregistrer sous personnage? (C'est 'options' 'et je me demande si' options (scipen = 100) 'fait vraiment ce que vous pensez qu'il est.)' '.Machine $ integer.max <1380742793415240 [1] TRUE' –

+0

Utilisation du champ de caractères pour que je ne serais pas capable d'interroger 'sql <- paste0 (" select * from tbl où b> = '", one_id,"' ")' efficacement. Tous les identifiants ne commencent pas par 138 ..., pour gérer ce cas, je devrais remplir les espaces de début avec des zéros pour avoir toutes les chaînes du même nchar. N'y a-t-il pas de solution plus élégante pour stocker des nombres comme '212982,1380742793415240' comme colonne de clé primaire et les interroger efficacement en utilisant l'opérateur'> '??? – jangorecki

+0

Je ne sais pas vraiment. Je sais que votre clé proposée ne rentrera pas dans les contraintes du mode entier de R. –

Répondre

2

Le sujet a été bien discuté et résolu sur la liste de diffusion de RpostgreSQL, reliant si quelqu'un aurait même problème: https://groups.google.com/forum/#!topic/rpostgresql-dev/NDc7NfUP6M8
Ci-dessous le contenu:

library(RPostgreSQL) 
# Loading required package: DBI 
c=dbConnect("PostgreSQL") 
a <- 1380742793415240 
b <- 1380742793415241 
dc <-data.frame(a=as.character(a), b=as.character(b)) 
dbWriteTable(c,"testclosenumberch", dc) 
# [1] TRUE 
dbGetQuery(c, "select * from testclosenumberch") 
# row.names    a    b 
# 1   1 1380742793415240 1380742793415241 
dbGetQuery(c, "select a::bigint - b::bigint from testclosenumberch") 
# ?column? 
# 1  -1 
Questions connexes