CREATE
CREATE TABLE una (
num int,
CHECK (num>8)
);
Una de las cosas que no sabía (tal vez porque no había leído la documentación con más detenimiento) es que en el momento de crear una tabla en en un manejador de base de datos, puedo agregar restricciones para mantener cierta integridad en la data al momento de que se esté populando dicha tabla. Algo bastante útil al momento de diseñar la base dedatos de alguna aplicación.
Sucede que MySQL, no se si por amor al arte, decide ignorar la sentencia “CHECK” para las restricciones. Es decir, si creo la siguiente tabla:
CREATE TABLE `prueba`.`persona` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`nombre` VARCHAR( 50 ) NOT NULL ,
`edad` TINYINT UNSIGNED NOT NULL ,
PRIMARY KEY ( `id` ),
CHECK (`edad` < 150)
) ENGINE = MYISAM COMMENT ='Tabla correspondiente a una persona'
Tendría algo como lo siguiente:
+--------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| nombre | varchar(50) | NO | | NULL | |
| edad | tinyint(3)unsigned | NO | | NULL | |
+--------+---------------------+------+-----+---------+----------------+
Excelente, hasta ahora…
El problema es que si trato de insertar algún record que viole dicha restriccion, MySQL simplemente lo ignorará, lo que te puede llevar a severas (muy graves) corrupciones de data en caso de que la integridad de la misma dependa directamente de las restricciones de cadatabla.
Si ejecuto la siguiente sentencia:
INSERT INTO `prueba`.`persona` (
`id` ,
`nombre` ,
`edad`
)
VALUES (
NULL , 'Don Juan de los Palotes', '190'
);
Obtendré lo siguiente:
Inserted rows: 1
Inserted row id: 4
Detallitos como estos son los que me han movido a considerar seriamente migrar para PostgreSQL.
Saludos,
43 - Indice único (unique)
Veamos el otro tipo de índice,único. Un índice único se crea con "unique", los valores deben ser únicos y diferentes, aparece un mensaje de error si intentamos agregar un registro con un valor ya existente. Permite valores nulos y pueden definirse varios por tabla. Podemos darle un nombre, si no se lo damos, se coloca uno por defecto.
Vamos a trabajar con nuestra tabla "libros".
Crearemos dos índices únicos, uno por un solocampo y otro multicolumna:
create table libros(
codigo int unsigned auto_increment,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(15),
unique i_codigo(codigo),
unique i_tituloeditorial (titulo,editorial)
);
Luego de la definición de los campos colocamos "unique" seguido del nombre que le damos y entre paréntesis el o los campos por los cuales se indexará dichoíndice.
"show index" muestra la estructura de los índices:
show index from libros;
PROBLEMA RESUELTO
Trabajamos con nuestra tabla "libros" de una librería.
Eliminamos la tabla, si existe.
Crearemos dos índices únicos, uno por un solo campo y otro multicolumna:
create table libros( codigo int unsigned auto_increment, titulo varchar(40) not null, autor varchar(30), editorial varchar(15),unique i_codigo (codigo), unique i_tituloeditorial (titulo,editorial) );
Veamos la información de los índices:
show index from libros;
Analicemos esta información:
Aparecen 3 filas.
La tabla tiene 2 índices (2 filas corresponden al mismo índice).
Ambos índices son únicos, o sea, no permiten valores repetidos, esto se indica en la columna "Non_unique".
La columna "Key_name" indica el nombre delos índices. La columna "Seq_in_index" y "Column_name" muestran la secuencia de la indexación para cada campo del índice "i_tituloeditorial". En el índice "i_tituloeditorial" y el campo "titulo" muestra 1 y para el campo "editorial" muestra 2, esto significa que está indexado en ese orden.
La columna "Null" indica si el campo permite valores nulos; el índice "i_codigo" no los permite; el campo...
Regístrate para leer el documento completo.