Bienvenido(a), Visitante. Favor de ingresar o registrarse.

Ingresar con nombre de usuario, contraseña y duración de la sesión

Foros del Club

Páginas: [1]   Ir Abajo
  Enviar tema  |  Imprimir  
Autor Tema: Parte de la clave primaria, autoincremental  (Leído 1658 veces)
0 Usuarios y 1 Visitante están viendo este tema.
CID
Administrador
Legend
*****

Prestigio: 22
Desconectado Desconectado

Sexo: Masculino
Estudiante de: Arte de la informática
Título universitario: Programador
Profesión: Desarrollador
Mensajes: 1136



WWW
Lenguajes:
Varios
Bases de datos:
Varios
« en: 28/04/2006, 22:52:21 »

Bueno, me he encontrado con varios puntos flojos de SQLite, pero éste sin lugar a dudas es tremendo.
Supongan que tienen una tabla de facturas:

Código:
CREATE TABLE FACTURAS (
NUMERO INTEGER NOT NULL,
TIPO CHAR(1) NOT NULL,
FECHA DATE NULL,
PRIMARY KEY (NUMERO, TIPO)
);

Aca tenemos una clave compuesta por NUMERO y por TIPO.
Buscaba una manera de autoincrementar la columna NUMERO (y solo NUMERO) al enviarle un NULL para ese campo, pero me encontré con ésto en un libro:

Citar
Beginning with version SQLite 2.3.4, If you declare a column of a table to be INTEGER PRIMARY KEY, then whenever you insert a NULL into that column of the table, the NULL is automatically converted into an integer which is one greater than the largest value of that column over all other rows in the table, or 1 if the table is empty. For example, suppose you have a table like this:

CREATE TABLE t1(
  a INTEGER PRIMARY KEY,
  b INTEGER
);

With this table, the statement

INSERT INTO t1 VALUES(NULL,123);

is logically equivalent to saying:

INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);

Traduciendo: La columna es definida automaticamente como autoincremental si se define precisamente como PRIMARY KEY y si la clave primaria es simple y entera. Entonces si en la sentencia INSERT se le pasa NULL, usando esa ultima sentencia bastante pobre por cierto, la columna se autoincrementaria.
Pero no dice nada sobre que sucede si la clave primaria es compuesta.
Ese silencio tiene significado: No sucede nada, se lo trata al NULL como lo que es, algo desconocido, ya que la columna no se considera como autoincremental.
Por lo que si intentase:

Código:
INSERT INTO FACTURAS VALUES(NULL, 'A')

El servidor se quejaria diciendo: Hey! NUMERO no puede ser desconocido!

En resumen, hasta que ésta libreria de enlace dinámico escrita en C que maneja archivos con consultas en un pseudo-SQL (lea atentamente esa definición) esté terminada (aunque ya vaya por la versión 3...), los programadores deberemos seguir programando esos detalles a mano.

Código:
INSERT INTO TEST (NUMERO, TIPO) VALUES((SELECT MAX(NUMERO)+ 1 FROM TEST),'B');

Saludos!

PD: Proximamente explicaré como funciona la implementación de triggers en SQLite.
En línea

Foros del Club
   

 En línea
Páginas: [1]   Ir Arriba
  Enviar tema  |  Imprimir  
 
Ir a: