Pregunta

Yo estaba trabajando en la creación de algunas mesas en foo base de datos, pero cada vez que terminan con errno 150 con respecto a la clave externa. En primer lugar, aquí está mi código para la creación de tablas:

CREATE TABLE Clients
(
client_id                CHAR(10)  NOT NULL ,
client_name              CHAR(50)  NOT NULL ,
provisional_license_num  CHAR(50)  NOT NULL ,
client_address           CHAR(50)  NULL ,
client_city              CHAR(50)  NULL ,
client_county            CHAR(50)  NULL ,
client_zip               CHAR(10)  NULL ,
client_phone             INT       NULL ,
client_email             CHAR(255) NULL ,
client_dob               DATETIME  NULL ,
test_attempts            INT       NULL
);
CREATE TABLE Applications
(
application_id   CHAR(10) NOT NULL ,
office_id        INT      NOT NULL ,
client_id        CHAR(10) NOT NULL ,
instructor_id    CHAR(10) NOT NULL ,
car_id           CHAR(10) NOT NULL ,
application_date DATETIME NULL 
);
CREATE TABLE Instructors
(
instructor_id      CHAR(10)  NOT NULL ,
office_id          INT       NOT NULL ,
instructor_name    CHAR(50)  NOT NULL ,
instructor_address CHAR(50)  NULL ,
instructor_city    CHAR(50)  NULL ,
instructor_county  CHAR(50)  NULL ,
instructor_zip     CHAR(10)  NULL ,
instructor_phone   INT       NULL ,
instructor_email   CHAR(255) NULL ,
instructor_dob     DATETIME  NULL ,
lessons_given      INT       NULL 
);
CREATE TABLE Cars
(
car_id             CHAR(10) NOT NULL ,
office_id          INT      NOT NULL ,
engine_serial_num  CHAR(10) NULL ,
registration_num   CHAR(10) NULL ,
car_make           CHAR(50) NULL ,
car_model          CHAR(50) NULL 
);
CREATE TABLE Offices
(
office_id       INT       NOT NULL ,
office_address  CHAR(50)  NULL ,
office_city     CHAR(50)  NULL ,
office_County   CHAR(50)  NULL ,
office_zip      CHAR(10)  NULL ,
office_phone    INT       NULL ,
office_email    CHAR(255) NULL 
);
CREATE TABLE Lessons
(
lesson_num     INT            NOT NULL ,
client_id      CHAR(10)       NOT NULL ,
date           DATETIME       NOT NULL ,
time           DATETIME       NOT NULL ,
milegage_used  DECIMAL(5, 2)  NULL ,
progress       CHAR(50)       NULL 
);
CREATE TABLE DrivingTests
(
test_num     INT       NOT NULL ,
client_id    CHAR(10)  NOT NULL ,
test_date    DATETIME  NOT NULL ,
seat_num     INT       NOT NULL ,
score        INT       NULL ,
test_notes   CHAR(255) NULL 
);

ALTER TABLE Clients ADD PRIMARY KEY (client_id);
ALTER TABLE Applications ADD PRIMARY KEY (application_id);
ALTER TABLE Instructors ADD PRIMARY KEY (instructor_id);
ALTER TABLE Offices ADD PRIMARY KEY (office_id);
ALTER TABLE Lessons ADD PRIMARY KEY (lesson_num);
ALTER TABLE DrivingTests ADD PRIMARY KEY (test_num);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Offices FOREIGN KEY (office_id) REFERENCES Offices (office_id);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Instructors FOREIGN KEY (instructor_id) REFERENCES Instructors (instructor_id);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Cars FOREIGN KEY (car_id) REFERENCES Cars (car_id);
ALTER TABLE Lessons ADD CONSTRAINT FK_Lessons_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id);
ALTER TABLE Cars ADD CONSTRAINT FK_Cars_Offices FOREIGN KEY (office_id) REFERENCES Offices (office_id);
ALTER TABLE Clients ADD CONSTRAINT FK_DrivingTests_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id);

Estos son los errores que me sale:

mysql> ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Cars FOREIGN KEY
(car_id) REFERENCES Cars (car_id);
ERROR 1005 (HY000): Can't create table 'foo.#sql-12c_4' (errno: 150)

Me corrió SHOW ENGINE INNODB STATUS que da una descripción de error más detallado:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
100509 20:59:49 Error in foreign key constraint of table foo/#sql-12c_4:
 FOREIGN KEY (car_id) REFERENCES Cars (car_id):
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
for correct foreign key definition.
------------

Busqué en StackOverflow y en otros lugares en línea - encontré con un post muy útil aquí con indicaciones sobre cómo resolver este error - pero no puedo imaginar lo que va mal. Cualquier ayuda se agradece!

¿Fue útil?

Solución

Se debe hacer car_id una clave principal en los coches.

Otros consejos

Nota:. Yo tenía el mismo problema, y ??fue debido a que el campo referenciado estaba en una intercalación diferente en las 2 tablas diferentes (tenían exactamente el mismo tipo)

Asegúrese de que todos los campos indicados tienen el mismo tipo y la misma intercalación!

Compruebe que ambas tablas tienen el mismo motor. Por ejemplo, si usted tiene:

CREATE Table FOO ();

y

CREATE Table BAR () ENGINE=INNODB;

Si intenta crear una restricción de la barra de mesa para FOO mesa, no va a funcionar en algunas versiones de MySQL.

Se corrige el fallo por lo siguiente:

CREATE Table FOO () ENGINE=INNODB;

sutil, pero este error me consiguió porque se me olvidó declarar una columna SMALLINT como sin firmar para que coincida con el, tabla existente referencia que era "smallint sin firmar." Tener uno sin firmar y sin firmar uno no causó MySQL para prevenir la clave externa que se creen en la nueva tabla.

id smallint(3) not null

no coincide, por el bien de las claves externas,

id smallint(3) unsigned not null

Tengo este error completamente inútil y poco informativo cuando traté de:

ALTER TABLE `comments` ADD CONSTRAINT FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE;

Mi problema estaba en mi mesa de comentarios, user_id se definió como:

`user_id` int(10) unsigned NOT NULL

Así que ... en mi caso, el problema era con el conflicto entre NOT NULL, y ON DELETE SET NULL.

Además, tanto las tablas deben tener mismo juego de caracteres.

para, por ejemplo,

CREATE TABLE1 (
  FIELD1 VARCHAR(100) NOT NULL PRIMARY KEY,
  FIELD2 VARCHAR(100) NOT NULL
)ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_bin;

a

CREATE TABLE2 (
  Field3 varchar(64) NOT NULL PRIMARY KEY,
  Field4 varchar(64) NOT NULL,
  CONSTRAINT FORIGEN KEY (Field3) REFERENCES TABLE1(FIELD1)
) ENGINE=InnoDB;

fallará debido a que tienen diferentes juegos de caracteres. Este es un nuevo fracaso sutil donde MySQL retorna mismo error.

Yo uso Ubuntu Linux, y en mi caso el error fue causado por la sintaxis de declaración incorrecta (que descubrí escribiendo perror 150 en la terminal, lo que da

código de error de MySQL 150: restricción de clave externa se forma incorrecta

Cambio de la sintaxis de la consulta de

alter table scale add constraint foreign key (year_id) references year.id;

a

alter table scale add constraint foreign key (year_id) references year(id);

fija a él.

El campo referenciado debe ser una "clave" en la tabla referenciada, no necesariamente una clave principal. Por lo que el "car_id" debe ser una clave principal o ser definida con restricciones NOT NULL y único en la tabla "Cars".

Y por otra parte, ambos campos deben ser del mismo tipo y colación.

También he recibido este error (por varias tablas), junto con los errores de restricción y MySQL conexión y desconexión al intentar importar una base de datos completa (~ 800 MB). Mi problema fue el resultado de El servidor MySQL max paquetes permitido ser demasiado baja. Para resolver este (en un Mac):

  • /private/etc/my.conf abierto
  • En # El servidor MySQL , max_allowed_packet cambiado de 1 M a 4 M (Es posible que tenga que experimentar con este valor.)
  • Restarted MySQL

La base de datos importado correctamente después de eso.

Tenga en cuenta que estoy ejecutando MySQL 5.5.12 para Mac OS X (x86 de 64 bits).

Marcar para que el campo que se está haciendo referencia a una coincidencia exacta con la clave externa, en mi caso fue uno sin firmar y el otro fue firmado por eso sólo los cambié para igualar y esta trabajado

ALTER TABLE customer_information Agregar restricción fk_customer_information1 FOREIGN KEY (user_id) REFERENCIAS users (id) ON DELETE CASCADE ON UPDATE CASCADE

Resuelto:

Asegúrese de que primary_key y FOREIGN_KEY son coincidencia exacta con tipos de datos. Si uno se firma otro sin firmar, se falló. Una buena práctica es asegurarse de que ambos son unsigned int.

Yo estaba usando un nombre duplicado de clave externa.

Cambiar el nombre el nombre FK resolvió mi problema.

Aclaración:

Los dos mesas tenían una restricción llamada PK1, FK1, etc. Cambiar el nombre de ellos / haciendo los nombres únicos resuelto el problema.

La columna de referencia debe ser un índice de una sola columna o la primera columna de índice de la columna multi, y el mismo tipo y la misma intercalación.

Mis dos tablas tienen los diferentes colaciones. Se puede demostrar mediante la emisión de estado de la tabla espectáculo como table_name y el cotejo se puede cambiar mediante la emisión de alter Convertir tabla table_name al conjunto de caracteres UTF-8.

todo, resuelve un problema y quería compartirlo:

tuve este error <> El problema estaba en que en mi declaración:

modificación de tabla de clave externa system_registro_de_modificacion complemento (Usuariomodificador_id) REFERENCIAS Usuario (ID) en Borrar restringir;

Me había escrito incorrectamente la carcasa: funciona en Windows WAMP, pero en Linux MySQL es más estricta con la carcasa, por lo que escribe "Usuario" en lugar de "usuario" (carcasa exacta), generado el error, y fue corregido simplemente cambiando la carcasa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top