Обсуждение: Generating TRUNCATE orders
Hi,
I wanted to write a SELECT that generates a TRUNCATE TABLE for all the tables in a given schema.
So I wrote:
SELECT 'TRUNCATE TABLE '
UNION
SELECT 'my_schema.' || c.relname ||', '
FROM pg_namespace nc, pg_class c
WHERE c.relnamespace = nc.oid
AND c.relkind IN ('r' )
AND nc.nspname = 'my_schema'
ORDER BY relname
UNION
SELECT 'my_schema.' || c.relname ||', '
FROM pg_namespace nc, pg_class c
WHERE c.relnamespace = nc.oid
AND c.relkind IN ('r' )
AND nc.nspname = 'my_schema'
ORDER BY relname
And this fails with the following message:
ERROR: column "relname" does not existSQL state:42703
If I run only the SELECT after the UNION that works as expected.
Of course, this is not a big deal as I copying and pasting this into a script file any way (and I will add the TRUNCATE TABLE manually).
But I don't understand why this does not work: the 2 SELECTs produce a single char column so from what I understand that should work ! ? !
If some body can explain I will be grateful.
PS: Of course, I realise the code produced by the SELECTs and UNION would not work straight away, because of the trailing comma !
L@u
The Computing Froggy
Ne gardez plus qu'une seule adresse mail ! Copiez vos mails vers Yahoo! Mail
Laurent ROCHE wrote: > > So I wrote: > SELECT 'TRUNCATE TABLE ' > UNION ... > ORDER BY relname > > And this fails with the following message: > ERROR: column "relname" does not exist > But I don't understand why this does not work: the 2 SELECTs produce a single char column so from what I understand thatshould work ! ? ! > If some body can explain I will be grateful. The "ORDER BY" is attached to the "UNION" not the second subquery. Catches everyone out from time to time. -- Richard Huxton Archonet Ltd
On 10/3/07, Laurent ROCHE <laurent_roche@yahoo.com> wrote:
Would this work:
SELECT
'TRUNCATE TABLE ' ||
'my_schema.' ||
c.relname ||', '
FROM pg_namespace nc, pg_class c
WHERE c.relnamespace = nc.oid
AND c.relkind IN ('r' )
AND nc.nspname = 'my_schema'
ORDER BY relname
On Oct 3, 2007, at 12:19 PM, Scott Marlowe wrote:
> On 10/3/07, Laurent ROCHE <laurent_roche@yahoo.com> wrote:
>
> Would this work:
>
> SELECT
> 'TRUNCATE TABLE ' ||
> 'my_schema.' ||
> c.relname ||', '
> FROM pg_namespace nc, pg_class c
> WHERE c.relnamespace = nc.oid
> AND c.relkind IN ('r' )
> AND nc.nspname = 'my_schema'
> ORDER BY relname
Or, just:
SELECT 'TRUNCATE ' || schemaname || '.' || tablename ';'
FROM pg_tables
WHERE schemname='my_schema'
ORDER BY tablename;
Erik Jones
Software Developer | Emma®
erik@myemma.com
800.595.4401 or 615.292.5888
615.292.0777 (fax)
Emma helps organizations everywhere communicate & market in style.
Visit us online at http://www.myemma.com
Erik Jones wrote: > On Oct 3, 2007, at 12:19 PM, Scott Marlowe wrote: > > SELECT 'TRUNCATE ' || schemaname || '.' || tablename ';' > FROM pg_tables > WHERE schemname='my_schema' > ORDER BY tablename; To be safe, you'd probably want to write SELECT 'TRUNCATE' || quote_ident(schemaname) || '.' || quote_ident(tablename) || ';' ... Otherwise, table or schema names containing funny characters, upper case, or spaces will cause trouble.. greetings, Florian Pflug