Re: Question about copy from with timestamp format - Mailing list pgsql-general

From Adrian Klaver
Subject Re: Question about copy from with timestamp format
Date
Msg-id 55BA474E.7080605@aklaver.com
Whole thread Raw
In response to Re: Question about copy from with timestamp format  (Sherrylyn Branchaw <sbranchaw@gmail.com>)
Responses Re: Question about copy from with timestamp format
List pgsql-general
On 07/30/2015 08:44 AM, Sherrylyn Branchaw wrote:
> I was thinking that perhaps an updatable view might do the trick?
>
> Interesting idea! Are you able to get it to work? I keep getting 'ERROR:
>   cannot copy to view "view_ts_test"' even before my trigger fires.
> Inserting, though, works fine.

 From here:

http://www.postgresql.org/docs/9.4/interactive/sql-copy.html

"COPY can only be used with plain tables, not with views. However, you
can write COPY (SELECT * FROM viewname) TO ...."

>
> Still curious why the triggers I'm writing won't fire before my
> statement errors out on copying to a view, or inserting an out-of-range
> timestamp, when the trigger would resolve all the illegal operations if
> it just fired first.

>
> On Thu, Jul 30, 2015 at 5:57 AM, Alban Hertroys <haramrae@gmail.com
> <mailto:haramrae@gmail.com>> wrote:
>
>
>     > On 30 Jul 2015, at 2:27, Sherrylyn Branchaw <sbranchaw@gmail.com <mailto:sbranchaw@gmail.com>> wrote:
>     >
>     > Based on your PS asking about data types and commenting that you don't want to put hour in a separate column,
itsounds like this is a brand-new table you're creating. If so, and if this is a one-time COPY operation, you can
createa text column for the initial import. Then after you're done importing, you can execute 
>     >
>     > ALTER TABLE ts_test ALTER COLUMN ts_fld TYPE TIMESTAMP USING (to_timestamp(ts_fld, 'YYYYMMDDHH24'));
>     >
>     > to convert the format of the imported data to a timestamp. Then you're set.
>     >
>     > If there will be ongoing imports of more files like this, though, you'll need the intermediate table solution
offeredby Adrian. 
>
>     Or keep both columns and update those where the text-column is NOT
>     NULL and the timestamp column is NULL.
>
>     > I was going to suggest a trigger, but it turns out that the data type checking happens even before the BEFORE
triggerfires, so you don't get a chance to massage your data before actually inserting it. I got 'ERROR:  date/time
fieldvalue out of range: "2015072913 <tel:2015072913>"' before the trigger even fired. I 
>     wonder if that's deliberate? I was able to implement a workaround by
>     adding a raw_ts_fld column of type text, but an extra column might
>     be too ugly for you relative to a temp table, I don't know.
>
>     I was thinking that perhaps an updatable view might do the trick?
>
>     You would need to create a view with the timestamp column converted
>     to text in the format in your CSV file. Next you add an INSERT rule
>     that does the conversion from text to timestamp and inserts the row
>     in the actual table. Finally, you use the view in the COPY statement
>     instead of the table.
>     Added bonus, you can now also use the view to export your table to
>     the same CSV format.
>
>     Alban Hertroys
>     --
>     If you can't see the forest for the trees,
>     cut the trees and you'll find there is no forest.
>
>


--
Adrian Klaver
adrian.klaver@aklaver.com


pgsql-general by date:

Previous
From: Adrian Klaver
Date:
Subject: Re: Transaction ID Wraparound Monitoring
Next
From: Sherrylyn Branchaw
Date:
Subject: Re: Question about copy from with timestamp format