PDA

Ver la Versión Completa : Problema al crear una llave primaria


MALBOTO22
30-05-2016, 05:51:46
Buenas noches, agradezco su colaboración para determinar que puedo estar haciendo mal o para saber si existe alguna restricción para crear llaves primarias con campos smallint.

Cree una base de datos con la siguiente estructura

CREATE DATABASE 'localhost:C:\BDSIDUTEC\SIDUTEC3.fdb'
USER 'SYSDBA' PASSWORD '**********'
PAGE_SIZE 4096
DEFAULT CHARACTER SET ISO8859_1;

/* Roles */
CREATE ROLE RDB$ADMIN;

/* Domains */
CREATE DOMAIN CAD_CORTA AS
CHAR(20);
CREATE DOMAIN CAD_LARGAS AS
VARCHAR(255);
CREATE DOMAIN CAD_MEDIANA AS
CHAR(40);
CREATE DOMAIN CARACTER AS
CHAR;
CREATE DOMAIN ENT_CORTO AS
SMALLINT [0:32767];
CREATE DOMAIN ENT_LARGO AS
INTEGER;
CREATE DOMAIN NUM_DOC AS
BIGINT
NOT NULL;

/* Tables */
CREATE TABLE TIPOS_IDENTIFI (
COD_TIP_IDE ENT_CORTO NOT NULL,
NOM_IDENTI CAD_MEDIANA NOT NULL
) ;
COMMIT;

/* Datos por tabla */
Intente crear una llave primaria cuando cree la tabla pero no me lo permitio, luego intente adicionar la llave primaria con el siguiente comando

ALTER TABLE TIPOS_IDENTIFI ADD CONSTRAINT PK_COD_TIP_IDE PRIMARY KEY (COD_TIP_IDE); No acepta el commando y genera el siguiente error:

Engine Error (code = 335544351):
unsuccessful metadata update.
attempt to index array column in index PK_COD_TIP_IDE.

SQL Error (code = -607):
This operation is not defined for system tables.
Para descartar un error en la sintaxis del comando ingrese el mismo código para el campo NOM_IDENTI y si se creo la llave primaria.

ALTER TABLE TIPOS_IDENTIFI ADD CONSTRAINT PK_COD_TIP_IDE PRIMARY KEY (NOM_IDENTI);
Ante esto me agradaria saber si es que los tipos de datos smallint tienen alguna restricción para crear las llaves primarias o los dominios pueden estar generando algún problema?

Mil gracias por la ayuda que me puedan brindar, estoy trabajando con Firebird 2.5.1., Firebird Maestro 14 y Windows 7 Profesional de 32 bits.

Casimiro Notevi
30-05-2016, 09:18:34
No sé si es algo nuevo, pero nunca había visto ese array:
CREATE DOMAIN ENT_CORTO AS SMALLINT [0:32767];
Lo normal:
CREATE DOMAIN ENT_CORTO AS SMALLINT;

Delphius
30-05-2016, 13:44:42
1. Si quieres declarar un array en firebird (aunque no es usual, y hasta sus propios desarrolladores desaconsejan su uso) la cosa es: Tipo [tamaño] mientras que tu haces Tipo [0:tamaño]

2. Tener un array como clave primaria no es legal.
3. El error justamente te dice que no está permitido.

4. Lee la Release Notes y la documentación de Firebird.

rastafarey
30-05-2016, 14:22:15
Por lógica una clave primaria deber unica, y un arreglo rompe esa regla.

Enviado desde mi SM-G900H mediante Tapatalk

MALBOTO22
30-05-2016, 17:57:46
Mil gracias por la colaboración, efectivamente el error fue mio, al crear el dominio le defini el arreglo y le puse los limites que aparecen en la definición.

Ya corregi borrando el dominio y volviendo a crearlo sin el arreglo y los limites ingresados.