Creando tablas

Empecemos por lo fácil. Crear tablas se consigue con CREATE TABLE y eliminarlas con DROP TABLE. Recuerda que aunque aquí no aparezcan todas las órdenes, tienes un fichero de texto que reproduce todo lo que se explicará a partir de ahora. Para ilustrar estas órdenes necesitamos una base de datos, las tablas se definen dentro de una base de datos. Por ejemplo, una tabla sencilla con una sola columna que almacena números enteros: 

CREATE TABLE mitabla (columna int);

Le hemos dado un nombre a la tabla, hemos abierto paréntesis, definido columnas, cerrado paréntesis y listo.

Eliminar tablas se consigue con la orden DROP TABLE.

DROP TABLE mitabla;

Volvamos a la creación de tablas ya con un poco más de detalle. 

CREATE TABLE unidad (

 unidad char(1),

 nombre varchar(15) DEFAULT NULL,

 PRIMARY KEY (unidad)

);

Lo primero, la orden en sí, CREATE TABLE. A continuación hay que darle un nombre único a la nueva tabla, uno que no se esté utilizando ya en la base de datos. Las tablas tienen columnas, si no, no son tablas. La definición de columnas va entre paréntesis obligatoriamente. No hace falta saltar de línea, lo estamos haciendo por darle claridad a la orden. Cada columna tiene un nombre —único dentro de la tabla— y un tipo de datos. Esto es lo mínimo.

 De los tipos de datos ya hablaremos pero aquí tenemos una columna llamada "unidad" de tipo carácter y de largo uno, un solo carácter.  La siguiente columna, "nombre", separada por una coma de la anterior, es de tipo carácter variable y con un largo de quince caracteres. 

Algunos valores posibles para unidad

'c'

'6'

'_'

' '

'@'

'P'

'0'

Algunos valores posibles para nombre

'hola'

'@ñ%$@!6'

'20E1'

'adiós'

'10/10/16'

'123sql456'

'aaaaa'

Además, hemos definido "nombre" con una restricción adicional y es que por defecto, automáticamente, el sistema asigne valor "nulo" a esa columna cuando nosotros no le damos valor. 

El valor nulo (NULL) necesitaría un curso para él solo. Vamos a simplificarlo. El modelo relacional introdujo un valor especial que significa ignorancia: cuando algo es nulo no sé si tiene valor o no, y si lo tiene no sé cuál es. Es cierto que las implicaciones del nulo son tantas que, al final, se simplifica con un "ausencia de valor", esto es, en vez de usar un cadena vacía, un cero o trampas similares, se utiliza el nulo. El sistema lo trata de forma especial y debemos ser conscientes de ello.

Por último, elegimos la columna "unidad" como clave primaria, como identificador de filas. Ahora, insertamos en la tabla a ver qué pasa.

insert into unidad values    

 ('c','centilitros'), 

 ('g','gramos'), 

 ('k','kilogramos'), 

 ('l','litros'), 

 ('u','unidad');

Fíjate que la columna "unidad" tiene valor en todas las filas y nunca se repite. Veamos que esto es así siempre.

insert into unidad values ('u','unitario');

Ahora estamos intentando añadir una fila con un valor en la columna "unidad" ya utilizado. Esto es un error porque esta columna es clave primaria, no admite duplicados.

insert into unidad values (null,'unitario');

Tampoco admite nulos por lo que no podemos insertar (nulo, 'unitario'). Recuerda que esto pasa en la clave primaria. En una columna normal y corriente, como "nombre", si puede haber nulos y duplicados.

insert into unidad (unidad) values ('a');

Veamos ahora la restricción de la columna "nombre" en la que hemos dicho que utilice nulos si no especificamos ningún valor. Dicho de otra forma, solo le damos el valor de la columna "unidad" y ninguno para "nombre".

Obviamente esto no es posible, no podemos insertar "medias filas". El servidor, porque en este caso puede hacerlo, rellena el trozo de fila faltante y el verdadero resultado es el que se muestra en la imagen, una fila completa ('a',null).

Como decíamos antes, nulo es un valor especial y complejo. Para entendernos, en nuestro ejemplo vendríamos a decir que la unidad 'a' no tiene nombre, aunque no sea realmente esto lo que quiere decir "nulo".

Volvamos a la clave primaria. Una clave primaria puede tener una o varias columnas. Supongamos que tiene dos. Eliminamos previamente la tabla "unidad" porque la vamos redefinir.

drop table unidad;

CREATE TABLE unidad (

 unidad char(1),

 variante integer,

 PRIMARY KEY (unidad,variante)

);

Sigue teniendo 2 columnas pero ahora ambas se utilizan para definir el identificador, la clave primaria. La nueva columna es "variante" y es de tipo número entero. 

¿Qué significa ahora "la clave primaria no admite duplicados"? Más sencillo será decir qué no es un duplicado en este caso. 

insert into unidad values (‘c’,1),(‘c’,2),(‘d’,2);

Ninguna de estas filas supone una repetición de clave primaria. Por decirlo así, "c1" es distinto de "c2" y ambos distintos de "d2". O sea, cada una de las columnas sí puede duplicar valores, es la combinación de las dos lo que nunca puede repetirse. 

insert into unidad (‘c’,1),(‘c’,2),(‘d’,2);

Por ejemplo, ahora sí sería un duplicado porque "d2" ya ha sido usado.

insert into unidad (null,null),(null,3),(‘e’,null);

¿Y los nulos? Fácil. No puede haber nulos en ninguna componente de la clave primaria.