PDA

Ver la Versión Completa : primary key


AMO
13-02-2004, 05:29:54
Saludos

Gracias por adelantado. Tengo una tabla en interbase conuna llave primaria de dos columnas, deseo agregar una nueva columna y forme parte de la llave. Para lo anterior pretendo eliminar la llave primaria y reconstruirla utilizando el comando ALTER TABLE.

El caso es que no me permite eliminarla...

Una solucion es copiar la informacion a otra tabla, eliminar la primera y crearla con las caracteristicas deseadas, una vez hecho cargarla con los valores.

Si alguno tubiera una solucion diferente se los agradeceria.

Saludos nuevamente.

__cadetill
13-02-2004, 09:29:55
No te deja??? Qué error da?? No será que tienes definido en alguna otra tabla algún FK??

AMO
13-02-2004, 18:19:52
Gracias por la pronta respuesta.

la tabla se creo con lo siguiente:

CREATE TABLE RUTAF_FAC
(
NORUTA INTEGER NOT NULL,
FACTURA INTEGER NOT NULL,
GUIA VARCHAR(10),
OBSERVACIONES VARCHAR(50),
PRIMARY KEY (NORUTA, FACTURA)
);

se pretende anexar una columan mas a la llave, por lo cual pretendo eliminar la llave de la siguiente forma:

Alter table rutaf_fac drop constraint primary key

que no estoy seguro que la instruccion sea asi. El error es

Token unknown line 1 char 38

__cadetill
13-02-2004, 18:43:17
Alter table rutaf_fac drop constraint primary key

que no estoy seguro que la instruccion sea asi. El error es

Efectivamente, la sintaxis no es así. Donde has escrito "primary key" has de escribir el nombre que le diste a esa primary key, algo como


Alter table rutaf_fac drop constraint PK_rutaf_fac

AMO
14-02-2004, 06:55:47
Saludos nuevamente


Tengo un pequeño problema, para el caso de indices tengo los nombres facilmente en el caso de las llaves primarias:

CREATE TABLE RUTAF_FAC
(
NORUTA INTEGER NOT NULL,
FACTURA INTEGER NOT NULL,
GUIA VARCHAR(10),
OBSERVACIONES VARCHAR(50),
PRIMARY KEY (NORUTA, FACTURA)
);

De donde saco el nombre? . Ya cheque en las tablas de systema de interbase y señala un nombre : rdb$primary2 pero al introducirlo en la sentencia


ALTER TABLE RUTAF_FAC DROP CONSTRAINT RDB$PRIMARY2


me genera un error en el cual indica que el nombre no existe. Probe con otrs nombres y lo mismo.

Alguna Idea?


Gracias

__cadetill
14-02-2004, 10:33:47
De donde saco el nombre?
Debería de salirte en la definición de la tabla (DDL).

Suponiendo que el motor sea Interbase/Firebird
* Si utilizas el IBExpert (que no lo se y si no es así, te lo recomiendo), cuando visualizas una tabla, hay una pestaña que se llama DDL. Allí te tiene que salir

* Si usas el SQL EXplorer, seleccionando la tabla y, dentro de ella Primary Key, en la pestaña de Text también puedes ver la definición del índice

A ver si alguna de estas soluciones te sirve

jachguate
14-02-2004, 18:11:07
Esto también debe dejarte como enseñanza... sobre todo con interbase, darle un nombre a todos los constraints que creas, porque el interprete de SQL te lo exigirá cuando querras alterarlos o borrarlos. Si no lo has hecho, en cada instancia de la base de datos que crees, los constriaints podrian tener nombres distintos, con lo que siempre vas a tener que averiguar primero el nombre del constraint antes de poder aplicar un script. Yo personalmente considero que esta es una deficiencia de la base de datos...

De esta forma la sentencia de creación de una tabla debiera parecerse a:

Create table Tabla (
Campo1 Tipo Not Null,
Campo2 Tipo Not Null,
Campo3 Tipo,
Constraint ElNombreDelConstraint
Primary Key (Campo1, Campo2),
Constraint ElNombreDelCheck
Check (Campo3 is null or Campo3 = 'VALOR')
);

Yo he tenido bastante problema con los checks... pues la costumbre del nombrar los otros constraints (aunque no sea necesario en otros SGDB's) ya la traia de antes, pero NUNCA habia nombrado un check, ya que siempre podia usar:

Alter table TalTabla Modify Columna Drop Check;

pero en interbase no hay NADA EQUIVALENTE... o al menos yo no lo he encontrado.

Hasta luego.

;)

AMO
14-02-2004, 20:50:05
Gracias

Encontre el nombre y pude eliminar la llave, bajare el ibexpert y seguire la recomendacion de nombrear cualquier constraint y asi evitar estos problemas.


Gracias nuevamente.