1005 phpmyadmin ошибка

I searched for a solution to this problem on the Internet and checked the Stack Overflow questions, but none of the solutions worked for my case.

I want to create a foreign key from table sira_no to metal_kod.

ALTER TABLE sira_no
    ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU)
    REFERENCES metal_kod(METAL_KODU)
    ON DELETE SET NULL
    ON UPDATE SET NULL ;

This script returns:

Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150)

I tried adding an index to the referenced table:

CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);

I checked METAL_KODU on both tables (charset and collation), but I couldn’t find a solution to this problem. How can I fix this problem?

Here is the metal_kod table:

METAL_KODU    varchar(4)    NO    PRI
DURUM    bit(1)    NO
METAL_ISMI    varchar(30)    NO
AYAR_YOGUNLUK    smallint(6)    YES        100

Peter Mortensen's user avatar

asked Jan 26, 2012 at 13:14

lamostreta's user avatar

1

Error Code: 1005 — there is a wrong primary key reference in your code

Usually it’s due to a referenced foreign key field that does not exist. It might be you have a typo mistake, or check case it should be same, or there’s a field-type mismatch. Foreign key-linked fields must match definitions exactly.

Some known causes may be:

  1. The two key fields type and/or size doesn’t match exactly. For example, if one is INT(10) the key field needs to be INT as well and not BIGINT or SMALLINT or TINYINT. You should also check that one is not SIGNED and the other is UNSIGNED. They both need to be exactly the same.
  2. One of the key field that you are trying to reference does not have an index and/or is not a primary key. If one of the fields in the relationship is not a primary key, you must create an index for that field.
  3. The foreign key name is a duplicate of an already existing key. Check that the name of your foreign key is unique within your database. Just add a few random characters to the end of your key name to test for this.
  4. One or both of your tables is a MyISAM table. In order to use foreign keys, the tables must both be InnoDB. (Actually, if both tables are MyISAM then you won’t get an error message — it just won’t create the key.) In Query Browser, you can specify the table type.
  5. You have specified a cascade ON DELETE SET NULL, but the relevant key field is set to NOT NULL. You can fix this by either changing your cascade or setting the field to allow NULL values.
  6. Make sure that the Charset and Collate options are the same both at the table level as well as individual field level for the key columns.
  7. You have a default value (that is, default=0) on your foreign key column
  8. One of the fields in the relationship is part of a combination (composite) key and does not have its own individual index. Even though the field has an index as part of the composite key, you must create a separate index for only that key field in order to use it in a constraint.
  9. You have a syntax error in your ALTER statement or you have mistyped one of the field names in the relationship
  10. The name of your foreign key exceeds the maximum length of 64 characters.

For more details, refer to: MySQL Error Number 1005 Can’t create table

Bill Karwin's user avatar

Bill Karwin

534k85 gold badges665 silver badges823 bronze badges

answered Jan 26, 2012 at 13:26

13

This could also happen when exporting your database from one server to another and the tables are listed in alphabetical order by default.
So, your first table could have a foreign key of another table that is yet to be created. In such cases, disable foreign_key_checks and create the database.

Just add the following to your script:

SET FOREIGN_KEY_CHECKS=0;

and it shall work.

answered May 7, 2015 at 13:27

happyhardik's user avatar

happyhardikhappyhardik

24.9k7 gold badges45 silver badges60 bronze badges

0

Very often it happens when the foreign key and the reference key don’t have the same type or same length.

Peter Mortensen's user avatar

answered Aug 25, 2014 at 12:29

zahid9i's user avatar

zahid9izahid9i

5861 gold badge8 silver badges17 bronze badges

0

Sometimes it is due to the master table is dropped (maybe by disabling foreign_key_checks), but the foreign key CONSTRAINT still exists in other tables. In my case I had dropped the table and tried to recreate it, but it was throwing the same error for me.

So try dropping all the foreign key CONSTRAINTs from all the tables if there are any and then update or create the table.

Peter Mortensen's user avatar

answered Feb 1, 2015 at 11:21

rajug's user avatar

rajugrajug

675 bronze badges

I had a similar error. The problem had to do with the child and parent table not having the same charset and collation. This can be fixed by appending ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

CREATE TABLE IF NOT EXISTS `country` (`id` INT(11) NOT NULL AUTO_INCREMENT,...) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

… on the SQL statement means that there is some missing code.

answered Jul 14, 2016 at 8:34

davidbwire's user avatar

davidbwiredavidbwire

962 silver badges3 bronze badges

The foreign key has to have the exact same type as the primary key that it references. For the example has the type “INT UNSIGNED NOT NULL” the foreing key also have to “INT UNSIGNED NOT NULL”

CREATE TABLE employees(
id_empl INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE offices(
id_office INT UNSIGNED NOT NULL AUTO_INCREMENT,
id_empl INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
CONSTRAINT `constraint1` FOREIGN KEY (`id_empl`) REFERENCES `employees` (`id_empl`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='my offices';

answered Feb 15, 2017 at 13:10

Yaina Villafañes's user avatar

1

Error Code: 1005

I had a similar issue, so here are few things that I did try (not in any order, except for the solution :) )

  1. Changed the foreign key names (it didn’t work)
  2. Reduced the foreign key length
  3. Verified the datatypes (darn nothing wrong)
  4. Check indexes
  5. Check the collations (everything fine, darn again)
  6. Truncated the table, of no good use
  7. Dropped the table and re-created
  8. Tried to see if any circular reference is being created — all fine
  9. Finally, I saw that I had two editors open. One that in PhpStorm (JetBrains) and the other MySQL workbench. It seems that the PhpStorm / MySQL Workbench creates some kind of edit lock.

    I closed PhpStorm just to check if locking was the case (it could have been the other way around). This solved my problem.

Peter Mortensen's user avatar

answered May 7, 2016 at 3:18

Rajiv Nair's user avatar

I had the very same error message. Finally I figured out I misspelled the name of the table in the command:

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES country (id);

versus

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES countries (id);

I wonder why on earth MySQL cannot tell such a table does not exist…

Peter Mortensen's user avatar

answered Feb 7, 2017 at 3:04

Csongor Halmai's user avatar

MyISAM has been just mentioned. Simply try adding ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ; at the end of a statement, assuming that your other tables were created with MyISAM.

CREATE TABLE IF NOT EXISTS `tablename` (
  `key` bigint(20) NOT NULL AUTO_INCREMENT,
  FOREIGN KEY `key` (`key`) REFERENCES `othertable`(`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

answered Jan 20, 2016 at 23:29

3xCh1_23's user avatar

3xCh1_233xCh1_23

1,4731 gold badge20 silver badges39 bronze badges

In my case, it happened when one table is InnoB and other is MyISAM. Changing engine of one table, through MySQL Workbench, solves for me.

answered Mar 28, 2016 at 2:01

rkawano's user avatar

rkawanorkawano

2,44322 silver badges22 bronze badges

It happened in my case, because the name of the table being referenced in the constraint declaration wasn’t correct (I forgot the upper case in the table name):

ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

Peter Mortensen's user avatar

answered Mar 10, 2015 at 15:45

Abdellah Stands with Palestine's user avatar

check both tables has same schema InnoDB MyISAM. I made them all the same in my case InnoDB and worked

answered Sep 21, 2019 at 2:35

Brian Sanchez's user avatar

Brian SanchezBrian Sanchez

8141 gold badge13 silver badges11 bronze badges

My problem was not listed, it was something so silly …..
The table that has the FK as PK was a composite PK that was declared like this: primary key (CNPJ, CEP)
I wanted the CEP field to be FK in another table and I was stuck in this error, the moral of the story just inverted the code above for Primary key (CEP, CNPJ) and it worked.
Get tip their friends.

Karthick Nagarajan's user avatar

answered Jun 8, 2020 at 4:49

fagner willys's user avatar

this is my code…i have no idea what i am doing wrong because i am new to this. i am getting an 1005 error saying that i cannot create the table bookauthor.

CREATE TABLE Book_Author(
    BID INTEGER(7) NOT NULL,
    B_TITLE VARCHAR(25) NOT NULL,
    AID INTEGER(7) NOT NULL,
    A_NAME VARCHAR(25) NOT NULL,
        CONSTRAINT PRIMARY KEY(BID),
        CONSTRAINT BID_FK
          FOREIGN KEY(BID)
          REFERENCES Book_Info(BID)
          ON DELETE CASCADE
);

Cyclonecode's user avatar

Cyclonecode

28.8k11 gold badges72 silver badges93 bronze badges

asked Feb 21, 2015 at 3:26

Megan Mcmasters's user avatar

2

You should try it following way

CREATE TABLE IF NOT EXISTS `Book_Author` (
  `BID` int(7) NOT NULL,
  `B_TITLE` varchar(25) NOT NULL,
  `AID` int(7) NOT NULL,
  `A_NAME` varchar(25) NOT NULL,
  PRIMARY KEY (`BID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Then use CASCADE

ALTER TABLE `Book_Author`
      ADD CONSTRAINT `BookAuthor` FOREIGN KEY (`BID`) 
REFERENCES Book_Info(BID) ON DELETE CASCADE;

answered Feb 21, 2015 at 3:29

underscore's user avatar

underscoreunderscore

6,4756 gold badges38 silver badges78 bronze badges

There are two possibilities in your case

You might not have used the same data type as the parent table column
(ex: parent table BID is varchar and in the child table BID is Integer(7))

or Referenced column is not a primary key on the parent table

Try this

create table Book_Info(BID INTEGER(7) NOT NULL,
                      CONSTRAINT PRIMARY KEY(BID));

CREATE TABLE Book_Author(
    BID INTEGER(7) NOT NULL,
    B_TITLE VARCHAR(25) NOT NULL,
    AID INTEGER(7) NOT NULL,
    A_NAME VARCHAR(25) NOT NULL,
        CONSTRAINT PRIMARY KEY(BID),
        CONSTRAINT BID_FK
          FOREIGN KEY(BID)
          REFERENCES Book_Info(BID)
          ON DELETE CASCADE
);
  • Sample Demo

answered Feb 21, 2015 at 3:55

Pரதீப்'s user avatar

Pரதீப்Pரதீப்

91.4k18 gold badges130 silver badges168 bronze badges

1005 (ER_CANT_CREATE_TABLE)

Cannot create table. If the error message refers to error 150, table
creation failed because a foreign key constraint was not correctly
formed. If the error message refers to error –1, table creation
probably failed because the table includes a column name that matched
the name of an internal InnoDB table.

My guess would be that this is because you haven’t created a PRIMARY KEY for you Book_Info table. You are trying to create a foreign key constraint and that requires that both table has valid index. You can add a primary key on your Book_Info table like this:

ALTER TABLE Book_Info ADD PRIMARY KEY BID_PK(BID);

Another thing that @NoDisplayName pointed out is that you should check so the two columns is of the same type and length.

You could check the status of your engine and try to find out more about this error:

SHOW ENGINE INNODB STATUSG

Then you might see a more descriptive error message like this:

———————— LATEST FOREIGN KEY ERROR ————————
2015-02-21 05:13:34 1116b0000 Error in foreign key constraint of table test/book_author:
FOREIGN KEY(BID) REFERENCES Book_Info(BID) ON DELETE CASCADE ):
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.6/en/innodb-foreign-key-constraints.html
for correct foreign key definition.

Community's user avatar

answered Feb 21, 2015 at 3:54

Cyclonecode's user avatar

CyclonecodeCyclonecode

28.8k11 gold badges72 silver badges93 bronze badges

It is important that you have the right privileges to access the database. You should ask your system administrator to give privileges to your access and if you are the admin, then make sure you are doing this action as root

answered May 15, 2017 at 2:51

Cyborg's user avatar

CyborgCyborg

3575 silver badges12 bronze badges

#1005 error Solved :-
Parent Table//
CREATE TABLE gender(

 id int not null AUTO_INCREMENT PRIMARY KEY,
 name varchar(50)

);

Child Table//
CREATE TABLE students (

id int not null AUTO_INCREMENT PRIMARY KEY,
name varchar(50),
fatherName varchar(50),
gender_id int not null,
CONSTRAINT fk_gender_id FOREIGN KEY (gender_id) REFERENCES gender(id) on DELETE SET null

);
In Child table you write not null means that this column does not allow null values and in foreign key you are saying that after deleting record from parent table put NULL in column (gender_id) but that column will not allow NULL values that’s why error #1005 occurs :)

answered Sep 15, 2017 at 12:26

zaib's user avatar

zaibzaib

592 silver badges3 bronze badges

Дата: 2.12.2016

Автор: Василий Лукьянчиков , vl (at) sqlinfo (dot) ru

Функционирование внешних ключей в MySQL имеет много нюансов и ограничений из-за чего существует немало возможностей получить ошибку при работе с ними. Одна из проблем состоит в том, что сообщения об ошибках содержат мало полезной информации и не указывают причину возникновения ошибки. В данной статье дается объяснение как получить дополнительную информацию об ошибке и приведен полный список причин возникновения ошибок внешних ключей. Каждая причина снабжена уникальным буквенно-цифровым кодом (А4, Б1, ..), использующимся в сводной таблице в конце статьи, которая поможет вам быстро диагностировать проблему.

Внешний ключ — это поле (или набор полей) в таблице, называемой дочерней, которое ссылается на поле (или набор полей) в таблице, называемой родительской. Дочерняя и родительская таблицы могут совпадать, т.е. таблица будет ссылаться на саму себя. Внешние ключи позволяют связать записи в двух таблицах по определенным полям так, что при обновлении поля в родительской автоматически происходит изменение записи в дочерней таблице.

В MySQL внешние ключи не реализованы на уровне сервера, их поддержка зависит от используемого хранилища данных. Содержание статьи справедливо для InnoDB (в том числе и для XtraDB).

Как получить больше данных об ошибке

После получения ошибки выполните SHOW ENGINE INNODB STATUS и смотрите содержимое секции LATEST FOREIGN KEY ERROR. Этот способ имеет следующие недостатки:

  • требует привилегии SUPER
  • содержит информацию о последней ошибке, связанной с внешними ключами, из-за чего нужно выполнять SHOW ENGINE INNODB STATUS сразу после возникновения ошибки, что не всегда удобно/возможно
  • используются внутренние имена таблиц (например, ‘test.#sql-d88_b’), что затрудняет диагностику
  • порой содержит мало полезной информации или таковая вообще отсутствует.

Альтернатива: использовать MariaDB версий больше 5.5.45 и 10.0.21, в которых сообщения об ошибках значительно улучшены и указывают причину возникновения ошибки.

Errno 150

Если в сообщении об ошибке содержится errno 150 (или errno 121), значит парсер MySQL не смог распознать ошибку и передал команду (create/alter) на выполнение в InnoDB. В этом разделе перечислены ситуации, приводящие к ошибкам, содержащим errno 150.

А1. Нет индекса в родительской таблице. Набор полей, на которые ссылается дочерняя таблица, должен быть проиндексирован (или являться левой частью другого индекса). Порядок полей в индексе должен быть таким же как в определении внешнего ключа. Сюда же относится случай отсутствия нужной колонки в родительской таблице (нет колонки, нет и индекса).

Неочевидный момент: на колонке родительской таблицы есть индекс — полнотекстовый (fulltext). Но внешний ключ всё равно не создается и сервер ругается на отсутствие индекса. Это происходит потому, что индекс должен быть обычным (btree).

Другой неочевидный момент: на колонке родительской таблицы есть индекс — префиксный. Но внешний ключ всё равно не создается и сервер ругается на отсутствие индекса. Это происходит потому, что индекс должен быть определен на всей длине колонки.

Строго говоря, поля в дочерней таблице тоже должны быть проиндексированы, но если нет подходящего индекса, MySQL автоматически его создаст при добавлении внешнего ключа (в совсем уж древних версиях требовалось предварительное создание индекса).

Примеры

create table t1 (a int, b int, index(a)) engine=innodb;

create table t2 (a int, foreign key (a) references t1(a), foreign key (a) references t1(b)) engine=innodb;
ERROR 1005 (HY000): Cannot create table ‘test.t2’ (errno: 150)

SHOW ENGINE INNODB STATUS;
————————
LATEST FOREIGN KEY ERROR
————————
2016-11-16 06:37:39 0x14c1c Error in foreign key constraint of table test/t2:
foreign key (a) references t1(b)) engine=innodb:
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.
Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constr
aints.html for correct foreign key definition.
————

— при использовании оператора ALTER ошибка и секция
— LATEST FOREIGN KEY ERROR будут содержать внутреннее имя таблицы test.#sql-a64_1

create table t2 (a int) engine=innodb;
alter table t2 add foreign key (a) references t1(a), add foreign key (a) references t1(b);
ERROR 1005 (HY000): Cannot create table ‘test.#sql-a64_1’ (errno: 150)

— в новых версиях парсер MySQL определяет некорректность
— конструкции и возвращает другую ошибку (без errno 150)

alter table t2 add foreign key (a) references t1(a), add foreign key (a) references t1(b);
ERROR 1215 (HY000): Cannot add foreign key constraint

— аналогично и для оператора CREATE

drop table t2;
create table t2 (a int, foreign key (a) references t1(a), foreign key (a) references t1(b)) engine=innodb;
ERROR 1215 (HY000): Cannot add foreign key constraint

Обратите внимание, если внешний ключ уже существует и в результате изменений (alter table) возникает ситуация отсутствия индекса в родительской таблице, то код ошибки будет 1025:

create table t1 (a int, b int, index(a)) engine=innodb;
create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;

alter table t1 drop a;
ERROR 1025 (HY000): Error on rename of ‘.test#sql-d6c_5′ to ‘.testt1′ (errno: 150)

show engine innodb status;
————————
LATEST FOREIGN KEY ERROR
————————
161220  7:14:25 Error in foreign key constraint of table test/t2:
there is no index in referenced table which would contain
the columns as the first columns, or the data types in the
referenced table do not match the ones in table. Constraint:
,
  CONSTRAINT «t2_ibfk_1» FOREIGN KEY («a») REFERENCES «t1» («a»)
The index in the foreign key in table is «a»
See http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html
for correct foreign key definition.
InnoDB: Renaming table `test`.`#sql-d6c_5` to `test`.`t1` failed!
———

А2. Родительская таблица не найдена в словаре данных InnoDB. Это означает, что родительская таблица должна существовать и быть постоянной InnoDB таблицей. Не временной InnoDB таблицей, так как информация о временных таблицах не сохраняется в словаре данных InnoDB. И уж тем более не представлением.

Примеры

mysql> create table t1 (a int, index(a)) engine=myisam;

mysql> create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;
ERROR 1215 (HY000): Cannot add foreign key constraint

— в старых версиях будет ошибка вида
ERROR 1005 (HY000): Cannott create table ‘test.t2’ (errno: 150)

show engine innodb status;
————————
LATEST FOREIGN KEY ERROR
————————
2016-11-17 16:30:09 0x364c Error in foreign key constraint of table world/t2:
foreign key (a) references t1(a)) engine=innodb:
Cannot resolve table name close to:
(a)) engine=innodb
————

А3. Синтаксическая ошибка. Внешние ключи реализованы на уровне хранилища, и в старых версиях парсер сервера MySQL не распознавал синтаксические ошибки внешних ключей, из-за чего их было трудно идентифицировать.

Примеры

Например, в определении внешнего ключа количество столбцов дочерней таблицы не совпадает с количеством столбцов родительской таблицы:

create table t1(id int not null primary key, b int, key(b)) engine=innodb;
Query OK, 0 rows affected (0.22 sec)

alter table t1 add foreign key(id,b) references t1(id);
ERROR 1005 (HY000): Can‘t create table ‘test.#sql-d88_b’ (errno: 150)

show warnings;
+——-+——+—————————————————+
| Level | Code | Message                                           |
+——-+——+—————————————————+
| Error | 1005 | Can‘t create table ‘test.#sql-d88_b’ (errno: 150) |
+——-+——+—————————————————+

— понять, что причина в синтаксической ошибке
— можно только из:

show engine innodb status;
————————
LATEST FOREIGN KEY ERROR
————————
160605 22:28:23 Error in foreign key constraint of table test/#sql-d88_b:
foreign key(id,b) references t1(id):
Syntax error close to:

— в новых версиях парсер распознает синтаксическую ошибку
— и сообщает об этом:
ERROR 1239 (42000): Incorrect foreign key definition for ‘foreign key without name’: Key reference and table reference don‘t match

Другой пример: попробуем создать внешний ключ на поле типа text:

create table t1 (a text , index(a(50))) engine=innodb;

create table t2 (a text, foreign key (a) references t1(a)) engine=innodb;
ERROR 1170 (42000): BLOB/TEXT column ‘a’ used in key specification without a key length

— MySQL автоматически пытается создать индекс на колонке `a`, и
— сообщает, что нельзя создать индекс по всей длине поля типа text.
— Хорошо, укажем префикс и получим errno 150:

create table t2 (a text, foreign key (a(50)) references t1(a)) engine=innodb;
ERROR 1005 (HY000): Cannot create table ‘test.t2’ (errno: 150)

— понять, что произошла ошибка синтаксиса можно:
— или через show engine innodb status;
— или внимательно сравнить разрешенный синтаксис в документации
— с написанной командой.

А4. Несовпадение типов данных. Столбцы дочерней таблицы, входящие в определение внешнего ключа, должны иметь такие же типы данных, что и столбцы родительской таблицы, на которые они ссылаются, вплоть до атрибутов: знак и кодировка/сопоставление.

Примеры

— например, если у одной колонки мы определим
— атрибут unsigned, а у другой нет, то:
create table t1 (a int unsigned, index(a)) engine=innodb;

create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;
ERROR 1215 (HY000): Cannot add foreign key constraint

— в старых версиях будет ошибка вида
ERROR 1005 (HY000): Cannott create table ‘test.t2’ (errno: 150)

show engine innodb status;
————————
LATEST FOREIGN KEY ERROR
————————
2016-11-26 03:00:47 0x10894 Error in foreign key constraint of table world/t2:
foreign key (a) references t1(a)) engine=innodb:
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.
Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constr
aints.html for correct foreign key definition.
————

Если несоответствие типов данных возникает во время изменения таблицы при уже существующем внешнем ключе, то ошибка будет иметь вид:

create table t1 (a int, index(a)) engine=innodb;
create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;

MariaDB [test]> alter table t1 modify a int unsigned;
ERROR 1025 (HY000): Error on rename of ‘.test#sql-d6c_6′ to ‘.testt1′ (errno: 150)

А5. Некорректно задано действие внешнего ключа. Если в определении внешнего ключа указано ON UPDATE SET NULL и/или ON DELETE SET NULL, то соответствующие столбцы дочерней таблицы не должны быть определены как NOT NULL.

Примеры

create table t1 (a int not null, index(a)) engine=innodb;

create table t2 (a int not null, foreign key (a) references t1(a) on delete set null) engine=innodb;
ERROR 1215 (HY000): Cannot add foreign key constraint

— в старых версиях будет:
ERROR 1005 (HY000): Cannot create table ‘test.t2’ (errno: 150)

show engine innodb status;
————————
LATEST FOREIGN KEY ERROR
————————
2016-11-26 06:24:42 0x10894 Error in foreign key constraint of table world/t2:
foreign key (a) references t1(a) on delete set null) engine=innodb:
You have defined a SET NULL condition though some of the
columns are defined as NOT NULL.
————

Если коллизия возникает при уже существующем внешнем ключе, то:

create table t1 (a int not null, index(a)) engine=innodb;
create table t2 (a int, foreign key (a) references t1(a) on delete set null) engine=innodb;

alter table t2 modify a int not null;
ERROR 1025 (HY000): Error on rename of ‘.test#sql-d6c_6′ to ‘.testt2′ (errno: 150)

А6. Дочерняя таблица является временной InnoDB таблицей. Внешние ключи можно создавать только в постоянной, несекционированной InnoDB таблице.

Примеры

create table t1 (a int, index(a)) engine=innodb;

create temporary table t2 (a int, foreign key (a) references t1(a)) engine=innodb;
ERROR 1005 (HY000): Cannot create table ‘test.t2’ (errno: 150)

show engine innodb status;
————————
LATEST FOREIGN KEY ERROR
————————
161130  4:22:26 Error in foreign key constraint of table temp/#sql318_4_1:
foreign key (a) references t1(a)) engine=innodb:
Cannot resolve table name close to:
(a)) engine=innodb
———

— в новых версиях ошибка будет иметь вид:
ERROR 1215 (HY000): Cannot add foreign key constraint

А7. Родительская таблица является секционированной таблицей. На данный момент (MySQL 5.7 и MariaDB 10.1) внешние ключи не поддерживаются для секционированных таблиц (partitioned tables). Иными словами, ни родительская, ни дочерняя таблица не должны иметь секции. В случае, когда внешний ключ ссылается на секционированную таблицу диагностика ошибки затруднена ошибкой вывода show engine innodb status:

Примеры

create table t1 (a int, index(a)) partition by range (a)  
(partition p0 values less than (10),
partition p1 values less than (20),
partition p2 values less than maxvalue);

create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;
ERROR 1005 (HY000): Cannot create table ‘test.t2’ (errno: 150)

show engine innodb status;
————————
LATEST FOREIGN KEY ERROR
————————
161223 19:38:14 Error in foreign key constraint of table test/t2:
foreign key (a) references t1(a)) engine=innodb:
Cannot resolve table name close to:
(a)) engine=innodb
———
— сообщение указывает на то, что родительская таблица
— не найдена в словаре данных innodb (bug: 84331)

— в новых версиях ошибка будет иметь вид:

create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;
ERROR 1215 (HY000): Cannot add foreign key constraint

Если разбивать на секции родительскую таблицу после создания внешнего ключа, то

create table t1 (a int, index(a)) engine=innodb;
create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;

alter table t1 PARTITION BY HASH(a) PARTITIONS 8;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

show engine innodb status;
— не содержит секцию LATEST FOREIGN KEY ERROR

Errno 121

Такой результат возникает только в одном случае.

Б1. Неуникальное имя ограничения. Обратите внимание: речь не о имени внешнего ключа. Если при создании внешнего ключа вы указываете не обязательное ключевое слово CONSTRAINT, то идущий после него идентификатор должен быть уникальным в пределах базы данных.

Примеры

create table t1 (a int, index(a)) engine=innodb;

create table t2 (a int, CONSTRAINT q1 foreign key (a) references t1(a)) engine=innodb;

create table t3 (a int, CONSTRAINT q1 foreign key (a) references t1(a)) engine=innodb;
ERROR 1005 (HY000): Cannot create table ‘test.t3’ (errno: 121)

— в 5.7 будет другая ошибка
ERROR 1022 (23000): Cannot write; duplicate key in table ‘t3’

show engine innodb status;
————————
LATEST FOREIGN KEY ERROR
————————
161130  3:31:11 Error in foreign key constraint creation for table `test`.`t3`.
A foreign key constraint of name `test`.`q1`
already exists. (Note that internally InnoDB adds ‘databasename’
in front of the user-defined constraint name.)
Note that InnoDB FOREIGN KEY system tables store
constraint names as case-insensitive, with the
MySQL standard latin1_swedish_ci collation. If you
create tables or databases whose names differ only in
the character case, then collisions in constraint
names can occur. Workaround: name your constraints
explicitly with unique names.
———

Нет ошибок

Внешний ключ не создается, и нет никаких ошибок. Это может происходить по следующим причинам:

В1. Дочерняя таблица не является InnoDB таблицей. В этом случае для совместимости с другими субд парсер MySQL просто проигнорирует конструкцию внешнего ключа.

Примеры

create table t1 (a int, index(a)) engine=innodb;

create table t2 (a int, foreign key (a) references t1(a)) engine=myisam;
Query OK, 0 rows affected (0.33 sec)

MariaDB [test]> show create table t2G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `a` int(11) DEFAULT NULL,
  KEY `a` (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

В2. Не соответствует синтаксису MySQL. Стандарт SQL разрешает указывать внешний ключ сразу при объявлении колонки с помощью конструкции REFERENCES (например, … a int references t1(a), …), однако MySQL игнорирует такую форму записи. Единственный способ создать в нем внешний ключ — это использовать отдельный блок FOREIGN KEY:

[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, …)
    REFERENCES tbl_name (index_col_name,…)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

Несоответствие данных

В этой части собраны ошибки, которые возникают из-за нарушения ссылочной целостности, т.е. наличие в дочерней таблице записей, которым нет соответствия в родительской таблице.

Г1. Удаление родительской таблицы. Нельзя удалить родительскую таблицу при наличии внешнего ключа.

create table t1 (a int, index(a)) engine=innodb;
create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;

drop table t1;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

Удаление следует понимать в расширенном варианте как удаление из множества InnoDB таблиц. Например, если мы сменим (alter table) движок родительской таблицы на MyISAM, то с точки зрения ограничения внешнего ключа родительская таблица перестанет существовать (т.к. она должна быть постоянной innodb таблицей):

alter table t1 engine=myisam;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

Сначала нужно удалить внешний ключ (или всю дочернюю таблицу, что удалит в том числе и внешний ключ). Если вы не знаете какие таблицы являются дочерними для заданной таблицы, то это можно определить через запрос к information_schema:

select table_name from information_schema.key_column_usage
where table_schema = «test» and references_table_name = «t1»;

Г2. Изменение данных в родительской таблице. Если в определении внешнего ключа не задано действие при update/delete, то такие операции над родительской таблицей могут привести к несогласованности данных, т.е. появлению в дочерней таблице записей не имеющих соответствия в родительской таблице.

Примеры

create table t1 (a int, index(a)) engine=innodb;
create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;

insert into t1 values(1);
insert into t2 values(1);

update t1 set a=2;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1`(`a`))

Г3. Изменение данных в дочерней таблице. Если insert/update записи в дочерней таблицы приводит к несогласованности данных, то

Примеры

create table t1 (a int, index(a)) engine=innodb;
create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;

insert into t2 values(15);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`a`))

Г4. Добавление внешнего ключа на не пустую таблицу. При попытке добавить внешний ключ на таблицу, в которой есть записи, не удовлетворяющие условию внешнего ключа (т.е. не имеющие соответствия в родительской таблице), будет ошибка:

Примеры

create table t1 (a int, index(a)) engine=innodb;
create table t2 (a int, index(a)) engine=innodb;

insert into t2 values(2);

alter table t2 add foreign key (a) references t1(a);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`#sql-3f0_4`, CONSTRAINT `#sql-3f0_4_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`a`))

Г5. Не уникальный ключ в родительской таблице. По стандарту SQL набор полей, на которые ссылается внешний ключ, должен быть уникальным. Однако, реализация внешних ключей в InnoDB позволяет иметь несколько «родителей». Из-за этого возникает трудно диагностируемая ошибка:

Примеры

create table t1 (a int, index(a)) engine=innodb;
create table t2 (a int, index(a)) engine=innodb;

insert into t1 values (1),(1);
insert into t2 values(1);

delete from t1 where a=1 limit 1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1`(`a`))

Сводная таблица

По вертикали расположены коды ошибок MySQL, которые возникают при работе с внешними ключами («нет ошибок» соответствует ситуации, когда сервер не генерирует ошибку, но и не создает внешний ключ). По горизонтали — идентификаторы причин, которые могут привести к ошибке. Плюсы на пересечении указывают какие причины приводят к той или иной ошибке.

А1 А2 А3 А4 А5 А6 А7 Б1 В1 В2 Г1 Г2 Г3 Г4 Г5
MySQL error 1005 + + + + + + + +
MySQL error 1022 +
MySQL error 1025 + + +
MySQL error 1215 + + + + +
MySQL error 1217 + +
MySQL error 1239 +
MySQL error 1451 + +
MySQL error 1452 + +
нет ошибок + +

P.S. Если ваш случай не рассмотрен в статье, то задавайте вопрос на форуме SQLinfo. Вам ответят, а статья будет расширена.

Дата публикации: 2.12.2016

© Все права на данную статью принадлежат порталу SQLInfo.ru. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в бумажных изданиях допускается только с разрешения редакции.

это мой код… я понятия не имею, что я делаю неправильно, потому что я новичок в этом. Я получаю ошибку 1005, говоря, что я не могу создать таблицу bookauthor.

CREATE TABLE Book_Author(
    BID INTEGER(7) NOT NULL,
    B_TITLE VARCHAR(25) NOT NULL,
    AID INTEGER(7) NOT NULL,
    A_NAME VARCHAR(25) NOT NULL,
        CONSTRAINT PRIMARY KEY(BID),
        CONSTRAINT BID_FK
          FOREIGN KEY(BID)
          REFERENCES Book_Info(BID)
          ON DELETE CASCADE
);

21 фев. 2015, в 04:57

Поделиться

Источник

5 ответов

# 1005 ошибки решаемые: — Родитель Таблица //CREATE TABLE пола (

 id int not null AUTO_INCREMENT PRIMARY KEY,
 name varchar(50)

);

Таблица детей //CREATE TABLE студенты (

id int not null AUTO_INCREMENT PRIMARY KEY,
name varchar(50),
fatherName varchar(50),
gender_id int not null,
CONSTRAINT fk_gender_id FOREIGN KEY (gender_id) REFERENCES gender(id) on DELETE SET null

); В таблице «Дети» вы пишете не null, означает, что этот столбец не допускает нулевые значения, а во внешнем ключе вы говорите, что после удаления записи из родительской таблицы поместите NULL в столбец (gender_id), но этот столбец не позволит значениям NULL, почему ошибка № 1005 имеет место :)

zaib
15 сен. 2017, в 11:16

Поделиться

Важно, чтобы у вас были права доступа к базе данных. Вы должны попросить своего системного администратора предоставить права на ваш доступ, и если вы являетесь администратором, убедитесь, что вы выполняете это действие как root

Cyborg
15 май 2017, в 00:40

Поделиться

В вашем случае есть две возможности

Возможно, вы не использовали тот же data type что и столбец parent таблицы (например: родительская таблица BID — это varchar а в дочерней таблице BIDInteger(7))

или ссылочный столбец не является primary key в родительской таблице

Попробуй это

create table Book_Info(BID INTEGER(7) NOT NULL,
                      CONSTRAINT PRIMARY KEY(BID));

CREATE TABLE Book_Author(
    BID INTEGER(7) NOT NULL,
    B_TITLE VARCHAR(25) NOT NULL,
    AID INTEGER(7) NOT NULL,
    A_NAME VARCHAR(25) NOT NULL,
        CONSTRAINT PRIMARY KEY(BID),
        CONSTRAINT BID_FK
          FOREIGN KEY(BID)
          REFERENCES Book_Info(BID)
          ON DELETE CASCADE
);
  • Демо-версия

Pரதீப்
21 фев. 2015, в 02:10

Поделиться

1005 (ER_CANT_CREATE_TABLE)

Невозможно создать таблицу. Если сообщение об ошибке относится к ошибке 150, создание таблицы завершилось неудачно, потому что ограничение внешнего ключа было неправильно сформировано. Если сообщение об ошибке относится к ошибке -1, создание таблицы, вероятно, не удалось, потому что таблица содержит имя столбца, совпадающее с именем внутренней таблицы InnoDB.

Я предполагаю, что это потому, что вы не создали PRIMARY KEY для таблицы Book_Info. Вы пытаетесь создать ограничение внешнего ключа, и это требует, чтобы обе таблицы имели действительный индекс. Вы можете добавить первичный ключ в свою таблицу Book_Info следующим образом:

ALTER TABLE Book_Info ADD PRIMARY KEY BID_PK(BID);

Другое @NoDisplayName, которое @NoDisplayName указывает на то, что вы должны проверить, чтобы два столбца @NoDisplayName один и тот же тип и длину.

Вы можете проверить статус своего движка и попытаться узнать больше об этой ошибке:

SHOW ENGINE INNODB STATUSG

Затем вы можете увидеть более описательное сообщение об ошибке:

———————— ПОСЛЕДНИЕ ИНОСТРАННЫЕ КЛЮЧЕВЫЕ ОШИБКИ ———————- —
2015-02-21 05:13:34 1116b0000 Ошибка в отношении внешнего ключа таблицы test/book_author:
ИНОСТРАННЫЙ КЛЮЧ (BID) ССЫЛКИ Book_Info (BID) ПО УДАЛЕНИЮ КАСКАДА):
Не удается найти индекс в ссылочной таблице, где ссылочные столбцы отображаются в виде первых столбцов, или типы столбцов в таблице, а ссылочная таблица не соответствует ограничениям.
Обратите внимание, что внутренний тип хранения ENUM и SET изменен в таблицах, созданных с помощью> = InnoDB-4.1.12, и такие столбцы в старых таблицах не могут ссылаться на такие столбцы в новых таблицах.
См. Http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html для правильного определения внешнего ключа.

Cyclonecode
21 фев. 2015, в 01:33

Поделиться

Вы должны попробовать это следующим образом

CREATE TABLE IF NOT EXISTS 'Book_Author' (
  'BID' int(7) NOT NULL,
  'B_TITLE' varchar(25) NOT NULL,
  'AID' int(7) NOT NULL,
  'A_NAME' varchar(25) NOT NULL,
  PRIMARY KEY ('BID')
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Затем используйте CASCADE

ALTER TABLE 'Book_Author'
      ADD CONSTRAINT 'BookAuthor' FOREIGN KEY ('BID') 
REFERENCES Book_Info(BID) ON DELETE CASCADE;

underscore
21 фев. 2015, в 00:53

Поделиться

Ещё вопросы

  • 1Возможны ли два пакета в одном APK?
  • 0Как удалить тег IMG из HTML
  • 1Как запретить другому потоку изменять локальную ссылочную переменную в методе во время его работы?
  • 0Как отличить s от ş в подобном поиске
  • 1c # — работа с COM + объектом в WCF
  • 0как искать часть строки, а не все
  • 0Существует ли кроссплатформенная библиотека для событий файловой системы?
  • 0Директива общего доступа между приложениями в AngularJS
  • 1Linq обновляет другую таблицу после процесса соединения
  • 0Chrome показывает Access Control Allow Origin ошибка
  • 0Javascript ссылка на изображения LIGHTBOX
  • 0Как работать с аргументами в Xcode
  • 1Как получить пользователей из списка LiveData для отображения в Spinner с использованием базы данных комнат
  • 0Как вставить новую строку в таблицу через angularjs?
  • 0Как получить текст из диалогового окна textarea jquery UI
  • 0как предотвратить двойной щелчок мышью (за раз)
  • 1Форматирование файла в список с ценой, названием продукта и количеством
  • 1Насколько эффективна эта хеш-функция?
  • 1метрика f1_score в лайтбм
  • 1python / pandas извлекают определенный столбец из мультииндекса
  • 0Ошибка: недопустимое значение для атрибута <text> x = «NaN» в angularJS nvd3-multi-bar-chart
  • 0Присоединение узла к LinkedList
  • 1Android — убийство не освобождает память?
  • 1Использование понимания вложенного списка для проверки и изменения всех столбцов фрейма данных
  • 1Добавить счетчик на панель инструментов только для определенного фрагмента
  • 0Строки исчезают на Datatables?
  • 1Наблюдаемый список Приведение / Конверсия
  • 0AngularJS объем этого в фабрике
  • 1Повторите тест на AssertionError
  • 1Датагрид привязка МВВМ
  • 1C # Формат даты {0: t} — {0: t + 1} 00:00 — 01:00
  • 0Форма для разных получателей на основе переключателя ввода
  • 01066 — Не уникальный стол / псевдоним: «художники»
  • 3Не удалось разрешить com.android.support:support-compat:26.1.0
  • 1WebView внутри ViewPager внутри NestedScrollView без вертикальной прокрутки
  • 0манипулирование таблицей html с использованием foreach в codeigniter
  • 0Руководство Angular.js по запуску теста e2e с использованием транспортира
  • 1Назначение и вызов свойств объекта внутри другого объекта
  • 1Как я могу получить в своем API дочерний класс?
  • 1Захват сообщения окна и затем запуск кода
  • 1Сервис автоматического выхода из системы в приложении wpf
  • 1Как удалить динамически созданную таблицу в javascript?
  • 1Консоли Google Play 100% поэтапное развертывание не совпадают с Full Release?
  • 0Поиск галереи jQuery плагин
  • 0Почему SetInterval не работает (работает только один раз)
  • 1Используйте GetCheckedRadioButtonId () с внешней группой радиосвязи
  • 0Перегрузка оператора сложения со многими объектами c ++
  • 0Только пользователь тестера может публиковать на своей стене Facebook SDK v4 PHP
  • 0Сохранить массив элементов SDL_Surface в классе?
  • 0Генерация PDF от AngularJS

Сообщество Overcoder

SitePoint Forums | Web Development & Design Community

Loading

Понравилась статья? Поделить с друзьями:
  • 1004 ошибка опель астра h z16xer
  • 1004 ошибка миф
  • 1004 ошибка okko
  • 10036 ошибка microsoft windows distributedcom
  • 10030 ошибка сбербанка