incorrectly general formed foreign error ejemplo create constraint mysql foreign-keys mysql-error-1005

general - MySQL "ERROR 1005(HY000): No se puede crear la tabla ''foo.#Sql-12c_4''(errno: 150)"



mysql error 150 (14)

Estaba trabajando en la creación de algunas tablas en la base de datos foo , pero cada vez que termino con errno 150 con respecto a la clave externa. En primer lugar, aquí está mi código para crear 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 obtengo:

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)

SHOW ENGINE INNODB STATUS que proporciona una descripción más detallada del error:

------------------------ 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 sitios en línea, encontré una entrada de blog útil con sugerencias sobre cómo resolver este error , pero no puedo entender qué está pasando. ¡Cualquier ayuda sería apreciada!


Además, ambas tablas deben tener el mismo juego de caracteres.

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á porque tienen diferentes conjuntos de caracteres. Esta es otra falla sutil donde mysql devuelve el mismo error.


Debes hacer que car_id sea una llave primaria en autos.


El campo al que se hace referencia debe ser una "clave" en la tabla a la que se hace referencia, no necesariamente una clave principal. Por lo tanto, "car_id" debería ser una clave principal o definirse con restricciones NOT NULL y UNIQUE en la tabla "Cars".

Y, además, ambos campos deben ser del mismo tipo y colación.


Estaba usando un nombre de clave externa duplicado.

Renombrar el nombre FK resolvió mi problema.

Aclaración:

Ambas tablas tenían una restricción llamada PK1, FK1, etc. Renombrarlas / hacer que los nombres fueran únicos resolvió el problema.


La columna a la que se hace referencia debe ser un índice de una sola columna o la primera columna en el índice de varias columnas, y el mismo tipo y la misma intercalación.

Mis dos tablas tienen colaciones diferentes. Se puede mostrar emitiendo el estado de la tabla show como table_name y la intercalación se puede cambiar emitiendo alter table table_name convert al conjunto de caracteres utf8.


Nota: tuve el mismo problema, y ​​fue porque el campo al que se hace referencia estaba en una intercalación diferente en las 2 tablas diferentes (tenían exactamente el mismo tipo).

¡Asegúrese de que todos sus campos referenciados tengan el mismo tipo Y la misma intercalación!


Obtuve este error completamente inútil y poco informativo cuando intenté:

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

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

`user_id` int(10) unsigned NOT NULL

Entonces ... en mi caso, el problema fue con el conflicto entre NOT NULL y ON DELETE SET NULL.


Resuelto

Compruebe para asegurarse de que Primary_Key y Foreign_Key coincidan exactamente con los tipos de datos. Si uno tiene otro firmado sin firmar, se producirá un error. Una buena práctica es asegurarse de que ambos estén sin firmar int.


Sutil, pero este error me afectó porque olvidé declarar una columna smallint como unsigned para que coincida con la tabla existente, referenciada, que era "smallint unsigned". Tener uno sin firmar y otro sin firmar provocó que MySQL impidiera que se creara la clave externa en la nueva tabla.

id smallint(3) not null

no coincide, por el bien de las claves externas,

id smallint(3) unsigned not null


También recibí este error (para varias tablas) junto con errores de restricción y conexión y desconexión de MySQL al intentar importar una base de datos completa (~ 800 MB). Mi problema fue el resultado de que los paquetes máximos permitidos del servidor MySQL eran demasiado bajos. Para resolver esto (en una Mac):

  • Abierto /private/etc/my.conf
  • En # El servidor MySQL , se modificó max_allowed_packet de 1M a 4M (es posible que deba experimentar con este valor).
  • Se reinició MySQL

La base de datos importó con éxito después de eso.

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


Utilizo Ubuntu Linux, y en mi caso el error fue causado por una sintaxis incorrecta de las sentencias (que descubrí escribiendo perror 150 en la terminal, que da

Código de error 150 de MySQL: la restricción de clave externa se forma incorrectamente

Cambiar 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);

arreglado.


Verifique que AMBAS mesas tengan el mismo MOTOR. Por ejemplo, si tienes:

CREATE Table FOO ();

y:

CREATE Table BAR () ENGINE=INNODB;

Si intenta crear una restricción desde la tabla BAR a la tabla FOO, no funcionará en ciertas versiones de MySQL.

Solucione el problema siguiendo lo siguiente:

CREATE Table FOO () ENGINE=INNODB;


compruebe que el campo al que hace referencia sea una coincidencia exacta con la clave externa, en mi caso, uno no se firmó y el otro se firmó, así que simplemente los cambié para que coincidan y esto funcionó

ALTER TABLE customer_information ADD CONSTRAINT fk_customer_information1 FOREIGN KEY ( user_id ) REFERENCES users ( id ) ON DELETE CASCADE ON UPDATE CASCADE


todo, resolví un problema y quería compartirlo:

Tuve este error <> El problema estaba en eso en mi declaración:

alter table system_registro_de_modificacion add foreign key (usuariomodificador_id) REFERENCIAS Usuario (id) En delete restringe;

Escribí incorrectamente el CASING: funciona en Windows WAMP, pero en Linux MySQL es más estricto con CASING, por lo que escribir "Usuario" en lugar de "usuario" (carcasa exacta) generó el error y se corrigió simplemente cambiando el caja.