Обсуждение: Duplicating a table row while honouring key constraints

Поиск
Список
Период
Сортировка

Duplicating a table row while honouring key constraints

От
Gordon
Дата:
I'm developing a web application in PHP and Postgres that will
basically serve as a CMS.  I want to implement a feature to allow
users to make copies of documents or folders, so this will require the
appropriate rows to be duplicated.

If possible I'd like to do this with SQL queries and avoid SELECTing
the row, munging it in PHP and INSERTING it back.  I suspect that this
is probably the way I'll have to go, but if it could be done entirely
in SQL that would be nice.

At first I thought INSERT INTO table_name SELECT * from table_name
where primary_key = unique_value would do it, but that would obviously
violate the primary key uniqueness constraint.  I'm wondering if
there's a way to do this where I only grab the data to be copied and
let the database work out the new primary key itself.


Re: Duplicating a table row while honouring key constraints

От
Alvaro Herrera
Дата:
Gordon wrote:

> At first I thought INSERT INTO table_name SELECT * from table_name
> where primary_key = unique_value would do it, but that would obviously
> violate the primary key uniqueness constraint.  I'm wondering if
> there's a way to do this where I only grab the data to be copied and
> let the database work out the new primary key itself.

Well, try
INSERT INTO table_name SELECT col1, col2, ... FROM table_name WHERE
primary_key = unique_value

where the colX list excludes the primary key columns.  Perhaps add
DEFAULT specification for those so that they are generated from a
sequence or whatever default generator you have.

--
Alvaro Herrera       Valdivia, Chile   ICBM: S 39º 49' 18.1", W 73º 13' 56.4"
"A wizard is never late, Frodo Baggins, nor is he early.
 He arrives precisely when he means to."  (Gandalf, en LoTR FoTR)