2008-11-17 10 views
6

Estoy creando una nueva tabla dentro de mysql y estoy tratando de agregar una restricción de clave externa a uno de los campos.Teclas foráneas que desaparecen en phpMyAdmin

 
CREATE TABLE `onlineorder` (
    `receiptid` varchar(10) NOT NULL default '', 
    `delivereddate` date default NULL, 
    `cid` int(10) NOT NULL, 
    `card#` int(10) default NULL, 
    `expire` date default NULL, 
    PRIMARY KEY (`receiptid`), 
    FOREIGN KEY (receiptid) REFERENCES purchase 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

Sin embargo, después de que lo crea, voy a phpMyAdmin y exporto la tabla. y parece que la restricción de la clave externa ha desaparecido.

 
CREATE TABLE `onlineorder` (
    `receiptid` varchar(10) NOT NULL default '', 
    `delivereddate` date default NULL, 
    `cid` int(10) NOT NULL, 
    `card#` int(10) default NULL, 
    `expire` date default NULL, 
    PRIMARY KEY (`receiptid`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

¿Elimina phpMyAdmin las claves externas o estoy haciendo algo mal aquí?

Respuesta

6

Cuando se define una tabla con el motor de almacenamiento MyISAM, acepta FOREIGN KEY limitaciones, pero en silencio los tira. Los analiza, pero no almacena la restricción en los metadatos de la tabla y, posteriormente, no puede aplicar la restricción. Cuando solicita ver la idea de la base de datos de la definición de la tabla, no sabe nada sobre esa restricción, como ha descubierto.

Lo mismo ocurre con las restricciones CHECK (independientemente del motor de almacenamiento); analiza la sintaxis y la acepta, pero luego la ignora.

En mi humilde opinión, esto es algo terrible para el producto MySQL. Acepta SQL estándar sin errores, dejándole la impresión de que va a admitir la restricción de la manera estándar. ¡Pero no es así! Ni siquiera SHOW WARNINGS revela que MySQL ha ignorado la restricción.

Si utiliza el motor de almacenamiento InnoDB, tiene en cuenta la restricción de la clave externa.

+1

incluso con InnoDB la exportación no incluye la clave externa. (para mí) – sdfor

+2

ok lo descubrí. en la vista de relación, estaba agregando la clave foriegn en la columna de relaciones internas. mi error. debe ser ingresado en la siguiente columna. – sdfor

+0

De acuerdo, es una manera terrible de haberlo codificado. –

1

Además, PHPMyAdmin elimina extractos de RESTRICCIONES hasta que se hayan creado todas las tablas y se hayan insertado los datos. Si utiliza como PHPMySql para volcar la tabla por usted, encontrará al final del archivo una sección de la tabla ACTUALIZAR con todas sus entradas ADD CONSTRAINT.

0

Hay dos tipos de restricciones cuando la gestión de sus mesas con phpmyadmin:

  • interna: cuando se establece limitaciones con el diseñador phpmyadmin, por ejemplo, las limitaciones almacenados como internos, que no se incluye en la exportación.
  • InnoDB: estas limitaciones incluido en control de exportación de vídeo a cabo ligado al respecto

[Video: La creación de una restricción de clave externa] [1]

Cuestiones relacionadas