PostgreSQL: Sobre las primary keys y foreign keys.

Rodrigo Fuentealba darkprox en gmail.com
Lun Mayo 7 19:11:33 CLT 2007


El 7/05/07, Alvaro Herrera <alvherre en alvh.no-ip.org> escribió:
> Rodrigo Fuentealba escribió:
> > El 7/05/07, Alvaro Herrera <alvherre en alvh.no-ip.org> escribió:
> > >Rodrigo Fuentealba escribió:
> > >
> > >> >En ADOdb (http://adodb.sourceforge.net), cuando no especifico los
> > >> >datos que corresponden con la clave primaria (por ejemplo, el código
> > >> >de la misma),
> > >>
> > >> Cuando no especifico los datos que corresponden con la clave primaria
> > >> y ésta es serial, entonces se produce un error... el cual lógicamente
> > >> no debiera producirse... si es serial, ya tiene un valor per-default!
> > >
> > >Probablemente tienes datos en la tabla cuyos valores son superiores al
> > >valor que tiene la secuencia.
> > >
> > >Usa setval() para corregir la secuencia,
> >
> > Lo he probado con tablas vacías, con un registro, con 10 registros...
> > y continúa; el problema no está en la tabla, ni en la secuencia.
> > Preguntaba esto porque hay un problema en la clase PHP para manejar
> > estas cositas, pero para depurarlo necesitaba saber algo más de
> > PostgreSQL.
>
> Entonces vas a tener que explicar mejor cual es el problema que tienes
> (por ej. el error que se produce)

Si tengo (eheee, a la rápida...):

CREATE TABLE test
(
   codigo serial,
   nombre character varying (255),
   primary key (codigo)
);

La siguiente linea:

INSERT INTO test (nombre) VALUES ('Rodrigo');

"sí" inserta. (Automágicamente inserta el valor correspondiente).

Sin embargo:

require_once('adodb/adodb-active-record.inc.php');
$db = ADONewConnection('postgres');
$db->Connect('localhost','postgres','','testdb');

ADOdb_Active_Record::SetDatabaseAdapter($db);

class Test extends ADOdb_Active_Record{}
$test = new Test();

$test->nombre = 'Alvherre';
$test->save();

La clase reclama con que no se ha especificado el campo $test->codigo,
o bien que el código ya se ha insertado. Quiero arreglarlo, porque eso
mismo en MySQL funciona (o al menos da la impresión de que funciona).
Mi idea es asignarle a $test->codigo el valor
"test_codigo_seq::nextval();" o el que corresponda, de manera que se
ejecute bien, pero sacar ese valor desde la BD.

Ahora, si yo no agrego "nombre" y nombre está especificado como
"default null", entonces también reclama. En resumen, La clase PHP que
quiero usar, cuando se usa PostgreSQL, tiene idea de que existe una
tabla test, y que ésta tiene los atributos (columnas) código y nombre,
pero no es capaz de determinar cuáles de estos atributos son
necesarios ni cuáles ya están dados por defecto. Para arreglar eso
necesitaba más detalles sobre la metadata en PostgreSQL.

(Al menos es un avance, ahora la clase por lo menos hace escapado de
datos con las funciones de escape de PostgreSQL).

-- 
Rodrigo Fuentealba Cartes
Desarrollador de Sistemas Web
Registered User 387639 - http://counter.li.org



Más información sobre la lista de distribución Linux