HOWTO: Manipular id's y secuencias en Postgresql
Para cambiar el numero de sequencia a x:
ALTER SEQUENCE tabla_id_seq RESTART WITH x;
X se ingresa como last_value. El siguiente registro que se ingrese tendrá como id x+1
El problema es cuando se quiere re-escribir todos los id's para que queden secuenciales. Realmente no recomiendo hacer esto, cualquier referencia se perdería, referencias dentro de la base de datos, de nuestra aplicación o por ejemplo de google si el URL incluye el id. Pero si es necesario... aqui hay un ejemplo usando
http://almidon.org/∞:
<?php
#
# resetid.php - re-escribe los id's de una tabla de manera consecutiva, del 1 al n
#
# Usar: php -q resetid.php > resetid.sql
# para luego: psql -Upostgres -f resetid.sql dbname
#
$key =
'idtabla';
$table =
'tabla';
$sequence =
$table.
'_'.
$key.
'_seq';
$constraint =
$table.
'_pkey';
require('./classes/app.class.php');
$object =
$table .
'Table';
$data =
new $object;
$rows =
$data->
readData();
$sql =
"BEGIN;\n";
$sql .=
"ALTER TABLE $table DROP CONSTRAINT $constraint;\n";
$sql .=
"ALTER TABLE $table ADD COLUMN new_id int;\n";
$sql .=
"SET CONSTRAINTS ALL DEFERRED;\n";
$i=
0;
foreach($rows as $row) {
++
$i;
$sql .=
"UPDATE $table SET new_id='$i' WHERE $key='".
$row[$key].
"';\n";
}
$sql .=
"UPDATE $table SET $key=new_id;\n";
$sql .=
"ALTER TABLE $table DROP COLUMN new_id;\n";
$sql .=
"ALTER TABLE $table ADD PRIMARY KEY($key);\n";
$sql .=
"ALTER SEQUENCE $sequence RESTART WITH $i;\n";
$sql .=
"COMMIT;\n";
echo "$sql\n";
There are no comments on this page. [Add comment]