2013-10-03 6 views
1

Мне нужно иметь дело с, я полагаю, большой int, значения первичного ключа 1380742793415240. В R Я могу легко настроить параметр (scipen = 100), но мне нужно сохранить эти данные в postgres db. Я уже пытался использовать dbWriteTable по умолчанию (двойная точность) с результатом: нарушить constaint (возможно, дублировать ключи в представлении ... 4e + 015), а также после изменения целевого столбца на bigint с результатом: invalid input syntax for integer: "1.38074279341524e+015".R RpostgreSQL bigint datatype

пример: попробуйте сохранять и загружать из БДА следующих дтов

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

Что такое эффективный способ сохранить и загрузить этот вид данных в Postgres?

+0

Сохранить как символ? (Это 'options' ', и мне интересно, действительно ли' options (scipen = 100) 'действительно делает то, что вы думаете.)' .Machine $ integer.max <1380742793415240 [1] TRUE' –

+0

Использование символьного поля для что я не смог бы запросить 'sql <- paste0 (" select * from tbl где b> = '", one_id,"' ")' эффективно. Не все идентификаторы начинаются с 138 ..., чтобы обработать этот случай, мне нужно было бы заполнить начальные пробелы нулями, чтобы все строки были такими же nchar. Разве нет более элегантного решения для хранения чисел типа '212982,1380742793415240' в качестве столбца первичного ключа и эффективного запроса с помощью'> 'operator ??? – jangorecki

+0

Я действительно не знаю. Я знаю, что ваш предложенный ключ не будет вписываться в ограничения целочисленного режима R. –

ответ

2

Субъект был хорошо обсужден и решен в списке рассылки RpostgreSQL, связывая его, если кто-то будет иметь ту же проблему: https://groups.google.com/forum/#!topic/rpostgresql-dev/NDc7NfUP6M8
Ниже содержание:

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