Ver Mensaje Individual
  #9 (permalink)  
Antiguo 22/03/2013, 09:10
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 11 meses
Puntos: 447
Respuesta: bien planteado para manejar claves foraneas y FULLTEXT

Hola de nuevo franroa:

Creo que debes poner un poco más de atención a lo que lees en los manuales de MySQL o lo que ponemos en el Foro, porque estás cometiendo errores infantiles con tu código. Vayamos por partes:

Código:
CREATE TABLE files(
fileID BIGINT NOT NULL AUTO_INCREMENT,
fPath TEXT NOT NULL,/*UNIQUE*/
fDescription VARCHAR(250) NOT NULL,
fName VARCHAR (20) NOT NULL,T NULL,
fUploader INT NOT NULL,
PRIMARY KEY (fileID),
)ENGINE=INNODB;
Esta sentencia está mal por el código que está marcado en rojo, no sé si copiaste mal la sentencia o se cortó alguna parte, pero en la primer parte NO ESTÁS DEFINIENDO NINGÚN CAMPO, después solo pones T NULL, eso no corresponde a ninguna declaración, MySQL toma la coma como separador de la definición de cada campo, por lo tanto, toma T como un campo, pero no colocas ningún tipo de datos, ni nada por el estilo. En la última parte, después del PRIMARY KEY (fileID) NO DEBES COLOCAR NINGUNA COMA, porque te repito indica separador de campos... la sentencia debería quedar así:

Código MySQL:
Ver original
  1. CREATE TABLE files(
  2. fPath TEXT NOT NULL,
  3. fDescription VARCHAR(250) NOT NULL,
  4. fName VARCHAR (20) NOT NULL,
  5. fUploader INT NOT NULL,
  6. PRIMARY KEY (fileID)

Siguiendo con los errores:

Código:
DELIMITER ;;
CREATE TRIGGER 'insert_file' AFTER INSERT ON 'files' FOR EACH ROW BEGIN
    INSERT INTO filedescriptions (fileID, fName, fDescription)
        VALUES (new.fileID, new.fName, new.fDescription);
  END;;
checa esta liga:

http://dev.mysql.com/doc/refman/5.0/es/legal-names.html

Cita:
El carácter de encomillado de identificador es el acento grave: ('`'):
la comilla, tal como la colocas indica una CADENA DE TEXTO, para definir los nombres de los objetos de BD debes utilizar el ACENTO GRAVE (`) o en su defecto omitir este caracter...

Tu sentencia debería quedar así:

Código MySQL:
Ver original
  1. DELIMITER ;;
  2.     INSERT INTO filedescriptions (fileID, fName, fDescription)
  3.         VALUES (new.fileID, new.fName, new.fDescription);
  4.   END;;

o con el acento grave:

Código MySQL:
Ver original
  1. DELIMITER ;;
  2.     INSERT INTO filedescriptions (fileID, fName, fDescription)
  3.         VALUES (new.fileID, new.fName, new.fDescription);
  4.   END;;

Este código se ejecuta perfectamente en un servidor 5.5:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE files(
  2.     -> fileID BIGINT NOT NULL AUTO_INCREMENT,
  3.     -> fPath TEXT NOT NULL,
  4.     -> fDescription VARCHAR(250) NOT NULL,
  5.     -> fName VARCHAR (20) NOT NULL,
  6.     -> fUploader INT NOT NULL,
  7.     -> PRIMARY KEY (fileID)
  8.     -> )ENGINE=INNODB;
  9. Query OK, 0 rows affected (0.09 sec)
  10.  
  11. mysql> CREATE TABLE filedescriptions(
  12.     -> fileID BIGINT NOT NULL,
  13.     -> fName VARCHAR (20) NOT NULL,
  14.     -> fDescription VARCHAR(250) NOT NULL,
  15.     -> PRIMARY KEY (fileID),
  16.     -> FULLTEXT KEY description (fName, fDescription)
  17.     -> )ENGINE=MYISAM;
  18. Query OK, 0 rows affected (0.07 sec)
  19.  
  20. mysql> DELIMITER ;;
  21. mysql> CREATE TRIGGER insert_file AFTER INSERT ON files FOR EACH ROW BEGIN
  22.     ->     INSERT INTO filedescriptions (fileID, fName, fDescription)
  23.     ->         VALUES (new.fileID, new.fName, new.fDescription);
  24.     ->   END;;
  25. Query OK, 0 rows affected (0.07 sec)
  26.  
  27. mysql> DELIMITER ;;
  28. mysql> CREATE TRIGGER update_file AFTER UPDATE ON files FOR EACH ROW BEGIN
  29.     ->     IF (old.fileID!= new.fileID) OR (old.fDescription!= new.fDescription)
  30.  
  31.     ->     THEN
  32.     ->         UPDATE filedescriptions
  33.     ->             SET fileID=new.fileID,
  34.     ->                 fDescription=new.fDescription,
  35.     ->                 fileID=new.fileID
  36.     ->         WHERE fileID=old.fileID;
  37.     ->     END IF;
  38.     ->   END;;
  39. Query OK, 0 rows affected (0.07 sec)
  40.  
  41. mysql> CREATE TRIGGER delete_file AFTER DELETE ON files FOR EACH ROW BEGIN
  42.     ->     DELETE FROM filedescriptions WHERE fileID = old.fileID;
  43.     ->   END;;
  44. Query OK, 0 rows affected (0.07 sec)

Haz las correcciones pertinentes y pruébalo en el servidor 5.0, y si, deberías considerar hacer la migración de tu BD, pero insisto que ante todo debes poner atención en lo que haces.

Saludos
Leo.