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 almidon.org http://almidon.org/:

resetid.php
<?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.
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki