Avisar de contenido inadecuado

Tablas de mysql

{
}



¿Qué es una base de datos?

“Una base de datos permite organizar ciertos datos de manera que sea sencillo extraer cualquier información de los mismos”. Para entendernos con un ejemplo vamos a trabajar en una base de datos que servirá para guardar datos de la lista de películas de su colección, así, si los organizamos de una manera correcta en la base de datos, será muy sencillo obtener por ejemplo una lista ordenada alfabéticamente, saber cuales las a dirigido el mismo director, o en cuantas a participado un determinado actor etc. (Ahora ya parece que empezamos a entender lo que es una base de datos).

¿Qué es una tabla?

Como por ejemplo en Word, una tabla es una lista de datos, organizados por columnas y filas. Por ejemplo, la siguiente tabla muestra unas películas dentro de una lista.


Dentro de un sistema gestor de bases de datos, la información se puede organizar dentro de tablas, en las que solo tendremos que decidir qué columnas queremos que tenga y de que tipo va a ser la información que tendrán (Numérico, texto, etc)

Empezando con la base de datos

Ahora que ya sabemos que es una tabla y una base de datos; Y tenemos nuestro servidor MySQL instalado con XAMPP y sino, tienes la suerte de poder instalarlo muy sencillamente desde éste tip, vamos a empezar creando nuestra primera base de datos. Para ello, vamos a hacerlo íntegramente desde el PHPmyAdmin que esta en http://localhost/phpmyadmin/

 

 

 

 

 

 

Creando una base de datos

El nombre de nuestra base de datos será Videoteca. Crearemos nuestra base de datos dando al enlace que pone “Bases de datos”, que esta abajo, en nuestra pagina de http://localhost/phpmyadmin/ como podemos ver en esta imagen:


Ahora se nos abrirá una nueva ventana, donde abajo del todo veremos “Crear una base de datos”, en ella escribiremos el nombre de nuestra nueva base de datos, en este caso: Videoteca.


PD: en lo nombres no podemos escribir caracteres como, comas, acentos, ñ, etc.

Si todo ha ido bien, ahora nos pondrá que ya esta creada.


Crear tablas y campos para la base de datos

En el apartado anterior hemos aprendido a crear una base de datos MySQL, y he creado una, a la cual la he llamado “Videoteca”. Ahora el siguiente paso seria crear las tablas y los campos que nos hagan falta para posteriormente meter los datos, y eso es precisamente lo que vamos a aprender en este tutorial.

 

Creando una Tabla y sus campos en MySQL

Existen varias formas y programas diferentes para crear una tabla en una base de datos MySQL, pero lo voy a hacer desde phpMyAdmin, el motivo de hacerlo desde phpMyAdmin y no de otra forma es porque comúnmente, en todos los servidores ya sean caseros o de un hosting privados siempre suele tener un phpMyAdmin a mano.

En primer lugar vamos a nuestro phpMyAdmin y seleccionamos la base de datos que hemos creado anteriormente(Videoteca) como vemos en la siguiente imagen:


Ahora se cargara la base de datos y nos saldrá un mensaje que pone “no se han encontrado tablas en la base de datos” y más abajo veremos un pequeño formulario para crear nuestra primera tabla.

En nombre pondremos película y en número de campos pondremos 3.


Ahora damos a continuar y se nos cargara la pagina para crear los campos, en este caso serán los 3 que hemos puesto antes.

Veremos que tendremos que rellenar varios datos, pero no tenemos que preocuparnos, ya que explicaremos uno a uno lo que significa.

  • En Campo, pondremos el nombre del campo.
  • En Tipo, debemos poner el tipo de datos que se van a incluir en el campo, por ejemplo pondríamos:
    • VARCHAR si vamos a incluir un texto inferior a 255 caracteres ejemplo (nombres, DNI, direcciones).
    • TEXT si vamos a incluir un texto más largo de 255 caracteres ejemplo (noticias).
    • INT si deseamos escribir exclusivamente números.
    • DATE para poner fechas, o DATETIME, si queremos poner hora y fecha.



  • En Longitud, deberemos de poner el número de caracteres máximo que puede contener dicho campo, esto no hace falta para todos los tipos de datos, ya que por ejemplo para los de tipo DATE, o TEXT no hace falta, pero para los INT y VARCHAR es imprescindible.
  • En Nulo, podemos elegir Null o Not Null dependiendo si queremos que el campo pueda estar vacío (sin datos) o no.
  • En predeterminado, podemos poner lo que queramos que se ponga en el campo en el caso de que no se rellenen los datos o que se rellene de forma incorrecta.
  • En extra, vemos que podemos seleccionar Auto_Increment, esto nos sirve para llevar un orden de los datos que tenemos, por ejemplo, creamos un campo llamado id, de tipo INT y le ponemos auto_increment, de esta forma cada vez que se cree un nuevo dato en este campo se le sumara 1 a la id anterior, de forma que podremos llevar un pequeño orden.

Ahora que ya mas o menos he explicado para que es cada cosa voy a deciros que debemos de poner en cada uno de los 3 campos:

Campo 1
Nombre: id_pelicula
Tipo: INT
Nulo: Not Null
Extra: Auto_increment
Y marcamos la llave de Primaria

Campo 2
Nombre: pelicula
Tipo: VARCHAR
Longitud: 30
Nulo: Not Null

Campo 3
Nombre: Director
Tipo: VARCHAR
Longitud: 30
Nulo: Not Null

Ahora damos a Grabar y ya tendemos nuestra base de datos "Videoteca" con la tabla "películas" con la que podremos empezar a trabajar.

 

 

 

 

 

Información adicional

Si tienes alguna pregunta de este tut

Problema:

Trabajamos con las tablas "libros" y editoriales" de una librería.

Eliminamos dichas tablas, si existen:

 drop table if exists libros, editoriales;

Creamos las siguientes tablas:

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30) not null default 'Desconocido',
  codigoeditorial tinyint unsigned not null,
  precio decimal(5,2) unsigned,
  cantidad tinyint unsigned default 0,
  primary key (codigo)
 );
 
 create table editoriales(
  codigoeditorial tinyint unsigned auto_increment,
  nombre varchar(20) not null,
  primary key(codigoeditorial)
 );

Cargamos algunos registros en la tabla "editoriales":

 insert into editoriales (nombre) values('Planeta');
 insert into editoriales (nombre) values('Emece');
 insert into editoriales (nombre) values('Paidos');
 insert into editoriales (nombre) values('Sudamericana');

Cargamos algunos registros en la tabla "libros":

 insert into libros (titulo, autor,codigoeditorial,precio,cantidad)
  values('El Aleph','Borges',1,43.5,200);
 insert into libros (titulo, autor,codigoeditorial,precio,cantidad)
  values('Alicia en el pais de las maravillas','Lewis Carroll',2,33.5,100);
 insert into libros (titulo, autor,codigoeditorial,precio,cantidad)
  values('Martin Fierro','Jose Hernandez',1,55.8,50);






Como en ambas tablas, el código de la editorial se denomina "codigoeditorial", podemos omitir la parte "on" que indica los nombres de los campos por el cual se enlazan las tablas, empleando "natural join", se unirán por el campo que tienen en común:

 select titulo,nombre
  from libros as l
  natural join editoriales as e;

La siguiente sentencia tiene la misma salida anterior:

 select titulo,nombre
  from libros as l
  join editoriales as e
  on l.codigoeditorial=e.codigoeditorial;

También se puede usar "natural" con "left join" y "right join":

 select nombre,titulo
  from editoriales as e
  natural left join libros as l;

que tiene la misma salida que:

 select nombre,titulo
  from editoriales as e
  left join libros as l
  on e.codigoeditorial=l.codigoeditorial;

Hay que tener cuidado con este tipo de "join" porque si ambas tablas tiene más de un campo con igual nombre, MySQL no sabrá por cual debe realizar la unión.

Alteremos la tabla "libros" para que el campo "titulo" se denomine "nombre":

 alter table libros change titulo nombre varchar(40);

Ahora las tablas tienen 2 campos con igual nombre ("codigoeditorial" y "nombre"). Intentemos realizar un "natural join":

 select l.nombre,e.nombre
  from libros as l
  natural join editoriales as e;






No hay salida.

Alteramos nuevamente la tabla "libros" para que el campo "nombre" en adelante sea "titulo":

 alter table libros change nombre titulo varchar(40);

Alteramos la tabla "editoriales" para que el campo "codigoeditorial" se llame en adelante "codigo":

 alter table editoriales change codigoeditorial codigo tinyint unsigned auto_increment;

Si usamos "natural join", unirá las tablas por el campo "codigo", que es el campo que tienen igual nombre, pero el campo "codigo" de "libros" no hace referencia al código de la editorial sino al del libro, así que la salida será errónea:

select l.*,e.*
 from libros as l
 natural join editoriales as e;


Note que el libro con código "3" de editorial "Planeta" aparece como perteneciente a la editorial "Paidos" (código 3) porque buscó coincidencia del código del libro con el código de editorial.
























drop table if exists libros, editoriales;


create table libros(

  codigo int unsigned auto_increment,

  titulo varchar(40) not null,

  autor varchar(30) not null default 'Desconocido',

  codigoeditorial tinyint unsigned not null,

  precio decimal(5,2) unsigned,

  cantidad tinyint unsigned default 0,

  primary key (codigo)

 );


create table editoriales(

  codigoeditorial tinyint unsigned auto_increment,

  nombre varchar(20) not null,

  primary key(codigoeditorial)

 );


insert into editoriales (nombre) values('Planeta');

insert into editoriales (nombre) values('Emece');

insert into editoriales (nombre) values('Paidos');

insert into editoriales (nombre) values('Sudamericana');


insert into libros (titulo, autor,codigoeditorial,precio,cantidad)

  values('El Aleph','Borges',1,43.5,200);

insert into libros (titulo, autor,codigoeditorial,precio,cantidad)

  values('Alicia en el pais de las maravillas','Lewis Carroll',2,33.5,100);

insert into libros (titulo, autor,codigoeditorial,precio,cantidad)

  values('Martin Fierro','Jose Hernandez',1,55.8,50);


select titulo,nombre

  from libros as l

  natural join editoriales as e;


select titulo,nombre

  from libros as l

  join editoriales as e

  on l.codigoeditorial=e.codigoeditorial;


select nombre,titulo

  from editoriales as e

  natural left join libros as l;


select nombre,titulo

  from editoriales as e

  left join libros as l

  on e.codigoeditorial=l.codigoeditorial;



alter table libros change titulo nombre varchar(40);

select l.nombre,e.nombre

  from libros as l

  natural join editoriales as e;

alter table libros change nombre titulo varchar(40);

alter table editoriales change codigoeditorial codigo tinyint unsigned auto_increment;

select l.*,e.*

 from libros as l

 natural join editoriales as e;




drop table if exists libros, editoriales;
create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30) not null default 'Desconocido',
  codigoeditorial tinyint unsigned not null,
  precio decimal(5,2) unsigned,
  cantidad tinyint unsigned default 0,
  primary key (codigo)
 );
create table editoriales(
  codigoeditorial tinyint unsigned auto_increment,
  nombre varchar(20) not null,
  primary key(codigoeditorial)
 );
insert into editoriales (nombre) values('Planeta');
insert into editoriales (nombre) values('Emece');
insert into editoriales (nombre) values('Paidos');
insert into editoriales (nombre) values('Sudamericana');
insert into libros (titulo, autor,codigoeditorial,precio,cantidad)
  values('El Aleph','Borges',1,43.5,200);
insert into libros (titulo, autor,codigoeditorial,precio,cantidad)
  values('Alicia en el pais de las maravillas','Lewis Carroll',2,33.5,100);
insert into libros (titulo, autor,codigoeditorial,precio,cantidad)
  values('Martin Fierro','Jose Hernandez',1,55.8,50);
select titulo,nombre
  from libros as l
  natural join editoriales as e;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

titulo

nombre

El Aleph

Planeta

Alicia en el pais de las maravillas

Emece

Martin Fierro

Planeta

select titulo,nombre
  from libros as l
  join editoriales as e
  on l.codigoeditorial=e.codigoeditorial;

titulo

nombre

El Aleph

Planeta

Alicia en el pais de las maravillas

Emece

Martin Fierro

Planeta

select nombre,titulo
  from editoriales as e
  natural left join libros as l;

nombre

titulo

Planeta

El Aleph

Planeta

Martin Fierro

Emece

Alicia en el pais de las maravillas

Paidos


Sudamericana


select nombre,titulo
  from editoriales as e
  left join libros as l
  on e.codigoeditorial=l.codigoeditorial;

nombre

titulo

Planeta

El Aleph

Planeta

Martin Fierro

Emece

Alicia en el pais de las maravillas

Paidos


Sudamericana


alter table libros change titulo nombre varchar(40);
select l.nombre,e.nombre
  from libros as l
  natural join editoriales as e;
alter table libros change nombre titulo varchar(40);
alter table editoriales change codigoeditorial codigo tinyint unsigned auto_increment;
select l.*,e.*
 from libros as l
 natural join editoriales as e;
 
 
 
 
 
 
 
 
 
 

codigo

titulo

autor

codigoeditorial

precio

cantidad

codigo

nombre

1

El Aleph

Borges

1

43.50

200

1

Planeta

2

Alicia en el pais de las maravillas

Lewis Carroll

2

33.50

100

2

Emece

3

Martin Fierro

Jose Hernandez

1

55.80

50

3

Paidos


Secuencia de comandos SQL ejecutados correctamente.




Usar una base de datos MySQL como modo de almacenaje del clasificador bayesiano de SpamAssassin

Una de las ventajas de usar el modulo de almacenaje de MySQL para el clasificador bayesiano de spamassassin es que simplificamos el backup de dicha base de datos, ya que se hace conjuntamente con el resto de bases de datos del MySQL.

Además, en servidores muy cargados nos podemos encontrar con problema de concurrencia al acceder al fichero que almacena el clasificador. Por ejemplo, en el /var/log/maillog podríamos encontrar lo siguiente:

spamd[12486]: bayes: cannot open bayes databases /home/spamd/.spamassassin/bayes_* R/W: lock failed: File exists

Para poder instalar el modulo de MySQL deberemos tener instalados los siguientes módulos de perl:

  • DBI
  • DBD::mysql

En el caso que no estén instalados deberemos hacerlo mediante el comando cpan y la siguiente instrucción:

install DBI
install DBD::mysql





A continuación deberemos crear la base de datos donde almacenar las tablas:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 401831
Server version: 5.1.34 Source distribution
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> create database bayesstore;
Query OK, 1 row affected (0.00 sec)

A continuación podemos cargar la definición de las tablas usando el fichero sql/bayes_mysql.sql presente en el código fuente de spamassassin. Para nuestro caso cambiaremos el Storage Engine de MyISAM a InnoDB por tratarse de un entorno de alta concurrencia:

cat sql/bayes_mysql.sql | sed 's/MyISAM/InnoDB/g' | mysql -u root -p bayesstore

La definición de las tablas quedaría como la siguiente:

CREATE TABLE bayes_expire (
  id int(11) NOT NULL default '0',
  runtime int(11) NOT NULL default '0',
  KEY bayes_expire_idx1 (id)
);
 
CREATE TABLE bayes_global_vars (
  variable varchar(30) NOT NULL default '',
  value varchar(200) NOT NULL default '',
  PRIMARY KEY  (variable)
);
 
INSERT INTO bayes_global_vars VALUES ('VERSION','3');
 
CREATE TABLE bayes_seen (
  id int(11) NOT NULL default '0',
  msgid varchar(200) binary NOT NULL default '',
  flag char(1) NOT NULL default '',
  PRIMARY KEY  (id,msgid)
);
 
CREATE TABLE bayes_token (
  id int(11) NOT NULL default '0',
  token char(5) NOT NULL default '',
  spam_count int(11) NOT NULL default '0',
  ham_count int(11) NOT NULL default '0',
  atime int(11) NOT NULL default '0',
  PRIMARY KEY  (id, token),
  INDEX bayes_token_idx1 (token),
  INDEX bayes_token_idx2 (id, atime)
);
 
 
 
 
 
CREATE TABLE bayes_vars (
  id int(11) NOT NULL AUTO_INCREMENT,
  username varchar(200) NOT NULL default '',
  spam_count int(11) NOT NULL default '0',
  ham_count int(11) NOT NULL default '0',
  token_count int(11) NOT NULL default '0',
  last_expire int(11) NOT NULL default '0',
  last_atime_delta int(11) NOT NULL default '0',
  last_expire_reduce int(11) NOT NULL default '0',
  oldest_token_age int(11) NOT NULL default '2147483647',
  newest_token_age int(11) NOT NULL default '0',
  PRIMARY KEY  (id),
  UNIQUE bayes_vars_idx1 (username)
);

A continuación deberemos crear un usuario y contraseña para el acceso a dicha base de datos por parte de spamassassin:

GRANT usage ON bayesstore.* TO bayes@localhost identified by 'b9y3sp9ssw0rd';
GRANT SELECT, UPDATE, DELETE, INSERT ON bayesstore.bayes_token TO bayes;
GRANT SELECT, UPDATE, DELETE, INSERT ON bayesstore.bayes_vars TO bayes;
GRANT SELECT, DELETE, INSERT ON bayesstore.bayes_seen TO bayes;
GRANT SELECT, DELETE, INSERT ON bayesstore.bayes_expire TO bayes;
GRANT SELECT ON bayesstore.bayes_global_vars TO bayes;

A continuación hacemos un backup del clasificador bayesiano de spamassassin:

sa-learn --backup > /home/backup/spamassassin/backup.sa
sa-learn --clear

Finalmente deberemos modificar la configuración de SpamAssassin editando el fichero “local.cf“, por ejemplo en /etc/mail/spamassassin/zz_local_cf/local.cf.

En el caso genérico de usar un MySQL con alguna versión actual (superior a MySQL 4.1) deberemos añadir la siguiente linea:

bayes_store_module Mail::SpamAssassin::BayesStore::MySQL

En el caso extraño que se debiera usar una versión anterior por algún motivo deberíamos usar en su lugar el siguiente modulo genérico:

bayes_store_module Mail::SpamAssassin::BayesStore::SQL

A continuación deberemos definir las credenciales de acceso a la base de datos:

bayes_sql_dsn                   DBI:mysql:bayesstore:localhost
bayes_sql_username              bayes
bayes_sql_password              bayerpassword



Mediante bayes_sql_dsn estamos indicando que se trata de un MySQL, en la base de datos llamada “bayesstore” que se encuentra en localhost.

Con la configuración definida podemos proceder a cargar desde el backup que hemos hecho anteriormente mediante sa-learn:

sa-learn --restore /home/backup/spamassassin/backup.sa

Finalmente reiniciamos el spamd, si lo tenemos con daemontools lo podemos hacer con el siguiente comando:

svc -t /service/spamd/



Relacionados

Dentro de Correo July 28, 2009 Tags: spamassassin



{
}
{
}

Deja tu comentario Tablas de mysql

Identifícate en OboLog, o crea tu blog gratis si aún no estás registrado.

Avatar Tu nombre