From: | Christian Ullrich <chris(at)chrullrich(dot)net> |
---|---|
To: | pgsql-admin(at)postgresql(dot)org |
Subject: | Re: CREATE TABLE LIKE and tablespaces |
Date: | 2013-03-02 18:40:42 |
Message-ID: | kgth37$aup$1@ger.gmane.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-admin |
* David F. Skoll wrote:
> I have an application that creates a daily table from a "prototype"
> table, so something like:
>
> CREATE TABLE data_20130226 LIKE data_prototype INCLUDING DEFAULTS INCLUDING CONSTRATINTS INCLUDING INDEXES;
>
> It would be really nice to be able to add:
>
> INCLUDING TABLESPACE
Workaround:
CREATE OR REPLACE FUNCTION table_tablespace(p_relname regclass)
RETURNS name
LANGUAGE sql
AS $$
SELECT t.spcname
FROM pg_class c
JOIN pg_tablespace t
ON (c.oid = p_relname
AND COALESCE(
NULLIF(c.reltablespace, 0),
(SELECT dattablespace
FROM pg_database
WHERE datname = current_database())) = t.oid);
$$;
-- It is surprisingly difficult to get the tablespace of a table.
-- (Note to self: So *that* is what NULLIF() is for!)
CREATE OR REPLACE FUNCTION create_table_like(p_old regclass, p_new name)
RETURNS regclass
LANGUAGE plpgsql
AS $$
BEGIN
EXECUTE 'CREATE TABLE ' || quote_ident(p_new)
|| ' (LIKE ' || quote_ident(p_old::name)
|| ' INCLUDING DEFAULTS '
|| ' INCLUDING CONSTRAINTS '
|| ' INCLUDING INDEXES) '
|| ' TABLESPACE '|| quote_ident(table_tablespace(p_old))
|| ';';
RETURN p_new::regclass;
END;
$$;
test=> SELECT create_table_like('data_prototype', 'data_20130226');
create_table_like
-------------------
data_20130226
--
Christian
From | Date | Subject | |
---|---|---|---|
Next Message | Daniel Krysiak | 2013-03-04 12:53:09 | Problem with data migration from 9.1 to 9.2 |
Previous Message | Albe Laurenz | 2013-03-01 10:20:33 | Re: Assistance with libpq |