1025 ошибка при переименовании

I tried this in mysql:

mysql> alter table region drop column country_id;

And got this:

ERROR 1025 (HY000): Error on rename of './product/#sql-14ae_81' to
'./product/region' (errno: 150)

Any ideas? Foreign key stuff?

OMG Ponies's user avatar

OMG Ponies

326k82 gold badges523 silver badges502 bronze badges

asked Oct 1, 2008 at 23:33

Trenton's user avatar

2

You usually get this error if your tables use the InnoDB engine. In that case you would have to drop the foreign key, and then do the alter table and drop the column.

But the tricky part is that you can’t drop the foreign key using the column name, but instead you would have to find the name used to index it. To find that, issue the following select:

SHOW CREATE TABLE region;

This should show you the name of the index, something like this:

CONSTRAINT region_ibfk_1 FOREIGN
KEY (country_id) REFERENCES
country (id) ON DELETE NO
ACTION ON UPDATE NO ACTION

Now simply issue an:

alter table region drop foreign key
region_ibfk_1;

And finally an:

alter table region drop column
country_id;

And you are good to go!

answered Apr 11, 2011 at 0:45

Jeshurun's user avatar

JeshurunJeshurun

22.9k6 gold badges79 silver badges92 bronze badges

2

It is indeed a foreign key error, you can find out using perror:

shell$ perror 150
MySQL error code 150: Foreign key constraint is incorrectly formed

To find out more details about what failed, you can use SHOW ENGINE INNODB STATUS and look for the LATEST FOREIGN KEY ERROR section it contains details about what is wrong.

In your case, it is most likely cause something is referencing the country_id column.

dmckee --- ex-moderator kitten's user avatar

answered Oct 7, 2008 at 17:24

Harrison Fisk's user avatar

Harrison FiskHarrison Fisk

7,0743 gold badges25 silver badges14 bronze badges

2

You can get also get this error trying to drop a non-existing foreign key. So when dropping foreign keys, always make sure they actually exist.

If the foreign key does exist, and you are still getting this error try the following:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

// Drop the foreign key here!

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

This always does the trick for me :)

answered Oct 22, 2009 at 8:40

Jeroen's user avatar

JeroenJeroen

1511 silver badge2 bronze badges

1

Simply run the alter table query using ‘KEY’ instead of ‘FOREIGN KEY’ in the drop statement. I hope it will help to solve the issue, and will drop the foreign key constraint and you can change the table columns and drop the table.

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

here in DROP KEY instead of DROP FOREIGN KEY,

hope it will help.

Thanks

Prahalad Gaggar's user avatar

answered Feb 21, 2013 at 8:05

Sohail Khan's user avatar

Sohail KhanSohail Khan

7615 silver badges6 bronze badges

0

I know, this is an old post, but it’s the first hit on everyone’s favorite search engine if you are looking for error 1025.

However, there is an easy «hack» for fixing this issue:

Before you execute your command(s) you first have to disable the foreign key constraints check using this command:

SET FOREIGN_KEY_CHECKS = 0;

Then you are able to execute your command(s).

After you are done, don’t forget to enable the foreign key constraints check again, using this command:

SET FOREIGN_KEY_CHECKS = 1;

Good luck with your endeavor.

answered Jan 9, 2017 at 8:25

Baccata's user avatar

BaccataBaccata

4731 gold badge7 silver badges15 bronze badges

1

I had a similar issues once. I deleted the primary key from TABLE A but when I was trying to delete the foreign key column from table B I was shown the above same error.

You can’t drop the foreign key using the column name and to bypass this in PHPMyAdmin or with MySQL, first remove the foreign key constraint before renaming or deleting the attribute.

answered Jan 12, 2016 at 5:40

Joomler's user avatar

JoomlerJoomler

2,6303 gold badges30 silver badges37 bronze badges

Take a look in error file for your mysql database. According to Bug #26305 my sql do not give you the cause. This bug exists since MySQL 4.1 ;-)

answered Mar 16, 2010 at 16:39

marabol's user avatar

marabolmarabol

1,2572 gold badges15 silver badges22 bronze badges

1

If you are using a client like MySQL Workbench, right click the desired table from where a foreign key is to be deleted, then select the foreign key tab and delete the indexes.

Then you can run the query like this:

alter table table_name drop foreign_key_col_name;

answered Jan 8, 2013 at 20:25

iltaf khalid's user avatar

iltaf khalidiltaf khalid

9,9385 gold badges30 silver badges34 bronze badges

There is probably another table with a foreign key referencing the primary key you are trying to change.

To find out which table caused the error you can run SHOW ENGINE INNODB STATUS and then look at the LATEST FOREIGN KEY ERROR section

Use SHOW CREATE TABLE categories to show the name of constraint.

Most probably it will be categories_ibfk_1

Use the name to drop the foreign key first and the column then:

ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1;
ALTER TABLE categories DROP COLUMN assets_id;

answered Jan 11, 2016 at 13:24

youngdero's user avatar

youngderoyoungdero

3822 silver badges16 bronze badges

I got this error with MySQL 5.6 but it had nothing to do with Foreign keys. This was on a Windows 7 Professional machine acting as a server on a small LAN.

The client application was doing a batch operation that creates a table fills it with some external data then runs a query joining with permanent tables then dropping the «temporary» table. This batch does this approximately 300 times and this particular routine had been running week in week out for several years when suddenly we get the Error 1025 Unable to rename problem at a random point in the batch.

In my case the application was using 4 DDL statements a CREATE TABLE followed by 3 CREATE INDEX, there is no foreign key. However only 2 of the indexes actually get created and the actual table .frm file was renamed, at the point of failure.

My solution was to get rid of the separate CREATE INDEX statements and create them using the CREATE TABLE statement. This at the time of writing has solved the issue for me and my help someone else scratching their head when they find this thread.

answered Jan 4, 2019 at 21:27

Chris Millard's user avatar

I’d guess foreign key constraint problem. Is country_id used as a foreign key in another table?

I’m not DB guru but I think I solved a problem like this (where there was a fk constraint) by removing the fk, doing my alter table stuff and then redoing the fk stuff.

I’ll be interested to hear what the outcome is — sometime mysql is pretty cryptic.

answered Oct 1, 2008 at 23:42

itsmatt's user avatar

itsmattitsmatt

31.3k10 gold badges101 silver badges164 bronze badges

1

In my case, I was using MySQL workbench and I faced the same issue while dropping one of my columns in a table. I could not find the name of the foreign key. I followed the following steps to resolve the issue:

  1. Rt. click on your schema and select ‘schema inspector’. This gives you various tables, columns, indexes, ect.

  2. Go to the tab named ‘Indexes’ and search the name of the column under the column named ‘Column’. Once found check the name of the table for this record under the column name ‘Table’. If it matches the name of the table you want, then note down the name of the foreign key from the column named ‘Name’.

  3. Now execute the query : ALTER table tableNamexx DROP KEY foreignKeyName;

  4. Now you can execute the drop statement which shall execute successfully.

answered Feb 25, 2016 at 7:51

chepaiytrath's user avatar

chepaiytrathchepaiytrath

6781 gold badge9 silver badges20 bronze badges

Doing

SET FOREIGN_KEY_CHECKS=0;

before the Operation can also do the trick.

answered Jan 14, 2017 at 16:25

Jan Tchärmän's user avatar

Jan TchärmänJan Tchärmän

9571 gold badge9 silver badges13 bronze badges

averageRatings= FOREACH groupedRatings GENERATE group AS movieID, AVG(ratings.rating) AS avgRating, COUNT(ratings.rating) AS numRatings;

If you are using any command like above you must use group in small letters. This may solve your problem it solved mine. At least in PIG script.

answered Apr 1, 2020 at 12:00

Naman Dhameja's user avatar

1

I get a #1025 error when this query is run.

SQL query:

ALTER TABLE  `routes` CHANGE  `end_loc`  `end_loc` VARCHAR( 500 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL

MySQL said:

#1025 - Error on rename of './ridestr/#sql-1f44_26eeb' to './ridestr/routes' (errno: 150) 

Which is funny because I set up this query in PHP MyAdmin…I don’t know why I’m getting a foreign key error…I’m just trying to change something from int to varchar

Can anyone help?

OMG Ponies's user avatar

OMG Ponies

326k82 gold badges523 silver badges502 bronze badges

asked Mar 17, 2011 at 11:20

joshdcomp's user avatar

2

If the routes.end_loc column is being used in a foreign key, then you can’t change its data type. You will need to drop the foreign key, change the data type of both the parent and child columns, and then add the foreign key again.

For details on this error, run SHOW ENGINE INNODB STATUS\G and then look at the LATEST FOREIGN KEY ERROR section.

answered Mar 17, 2011 at 15:33

Ike Walker's user avatar

Ike WalkerIke Walker

64.5k14 gold badges110 silver badges109 bronze badges

but it is very hard if you want to change in the whole charset to utf8 of all tables
here is what i did

     1 export the database (all tables) and open by notepad

     2 replace all "latin1" by utf8 and save

     3 then try to restore using mysqlAdministrator but it says wrong

     4 so try restoring again but you have to select ignore errors radio button
     5 it tries to restore some tables 

     6 then you have to restore again until no error message 

i know this is the hard way but i am sure this will work for you too

answered Apr 30, 2015 at 17:18

Shishay Kidane's user avatar

12 ответов

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

Но сложная часть заключается в том, что вы не можете удалить внешний ключ, используя имя столбца, но вместо этого вам нужно будет найти имя, используемое для его индексации. Чтобы найти это, выполните следующие действия:

ПОКАЗАТЬ СОЗДАТЬ область ТАБЛИЦЫ;

Это должно показать вам имя индекса, что-то вроде этого:

CONSTRAINT region_ibfk_1 ИНОСТРАННЫЙ КЛЮЧ (country_id) ССЫЛКИ country (id) ON УДАЛИТЬ НЕТ ACTION ON UPDATE NO ACTION

Теперь просто выпустите:

изменить внешний вид таблицы регистров region_ibfk_1;

И наконец:

изменить столбец падения таблицы таблицы COUNTRY_ID;

И тебе хорошо идти!

Jeshurun

Поделиться

Это действительно ошибка внешнего ключа, вы можете узнать, используя perror:

shell$ perror 150
MySQL error code 150: Foreign key constraint is incorrectly formed

Чтобы узнать более подробную информацию о том, что не удалось, вы можете использовать SHOW ENGINE INNODB STATUS и найти раздел LATEST FOREIGN KEY ERROR, содержащий подробные сведения о том, что не так.

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

Harrison Fisk

Поделиться

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

Если внешний ключ существует и вы все еще получаете эту ошибку, попробуйте следующее:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

//Оставьте здесь иностранный ключ!

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Это всегда делает трюк для меня:)

Jeroen

Поделиться

Просто запустите запрос alter table, используя «KEY» вместо «FOREIGN KEY» в инструкции drop. Я надеюсь, что это поможет решить проблему, и упустит ограничение внешнего ключа, и вы можете изменить столбцы таблицы и отбросить таблицу.

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

здесь, в DROP KEY вместо DROP FOREIGN KEY,

надеюсь, что это поможет.

Спасибо

Sohail

Поделиться

Выполнение

SET FOREIGN_KEY_CHECKS=0;

до того, как Операция также может выполнить трюк.

Jan Tchärmän

Поделиться

Я знаю, это старый пост, но это первый удар по каждой любимой поисковой системе, если вы ищете ошибку 1025.

Однако для устранения этой проблемы существует простой «взлом»:

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

SET FOREIGN_KEY_CHECKS = 0;

Затем вы можете выполнить свои команды.

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

SET FOREIGN_KEY_CHECKS = 1;

Удачи вам в ваших усилиях.

Baccata

Поделиться

У меня были похожие проблемы один раз. Я удалил первичный ключ из таблицы A, но когда я пытался удалить столбец внешнего ключа из таблицы B, мне была показана вышеприведенная ошибка.

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

Joomler

Поделиться

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

Чтобы узнать, какая таблица вызвала ошибку, вы можете запустить SHOW ENGINE INNODB STATUS, а затем посмотреть раздел LATEST FOREIGN KEY ERROR

Используйте категории SHOW CREATE TABLE, чтобы показать имя ограничения.

Скорее всего, это будут категории_ibfk_1

Используйте имя, чтобы сначала удалить внешний ключ и столбец:

ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1;
ALTER TABLE categories DROP COLUMN assets_id;

youngdero

Поделиться

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

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

alter table table_name drop foreign_key_col_name;

iltaf khalid

Поделиться

Взгляните в файл ошибки для вашей базы данных mysql. Согласно Ошибка № 26305 мой sql не дает вам причины. Эта ошибка существует с MySQL 4.1; -)

marabol

Поделиться

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

  • Rt. нажмите на свою схему и выберите «инспектор схемы». Это дает вам различные таблицы, столбцы, индексы, ect.

  • Перейдите на вкладку с названием «Индексы» и найдите имя столбца под столбцом «Столбец». После обнаружения проверьте имя таблицы для этой записи под именем столбца «Таблица». Если он совпадает с именем нужной таблицы, запишите имя внешнего ключа из столбца с именем «Имя».

  • Теперь выполните запрос: ALTER table tableNamexx DROP KEY foreignKeyName;

  • Теперь вы можете выполнить оператор drop, который должен успешно выполняться.

Jatin Shashoo

Поделиться

Я бы предположил проблему ограничения внешнего ключа. Используется ли country_id в качестве внешнего ключа в другой таблице?

Я не DB гуру, но я думаю, что я решил проблему вроде этого (там, где было ограничение fk), удалив fk, выполнив свой файл alter table, а затем переделав файл fk.

Мне будет интересно узнать, каков результат — иногда mysql довольно загадочный.

itsmatt

Поделиться

Ещё вопросы

  • 1Java: независимая запись звука с 2 разных микрофонных входов
  • 0jQuery: генерировать ссылку из содержимого ячейки таблицы
  • 0Проверка DOB проверки JQuery работает в Chrome, но не работает в Safari
  • 0получить выбранный переключатель из группы
  • 1Использование переменных для построения запроса LinQ?
  • 1Найдите совпадение в строке файла, затем перейдите к следующему файлу
  • 0Получить всю зарплату сотрудника из таблиц сотрудников с 3-й по величине зарплаты в MYSQL
  • 0Сохранение подключения MySQL на Express
  • 0Вторая строка повреждена после нескольких вызовов realloc
  • 1Как использовать модуль Python Mobilenium с селеном
  • 1SVG проблема с Glide с использованием сокращенного шестнадцатеричного цвета
  • 0Выберите значение из выпадающего списка, в котором данные взяты из базы данных
  • 1как получить значения для пользовательских полей пользовательской записи в Netsuite
  • 0Странный вывод из exec ()
  • 1Простой Android запрос https?
  • 1Это отношения многие ко многим?
  • 0событие backbutton (cordova) не влияет на переменные контроллера angularjs, как ожидалось
  • 1Ошибка установки pip с проверкой сертификата SSL (_ssl.c: 833)
  • 1Изменение формы массива Python определенным образом
  • 0Замена липкого заголовка вторым заголовком, когда он достигает текущего застрявшего заголовка
  • 1ASP.Net MVC длительный процесс
  • 0Почему встроенный не работает здесь?
  • 0Группировать записи по двум столбцам
  • 0Angularjs Форма ввода текста всегда не определена
  • 0php простой поиск по регулярному выражению, замена и перемешивание подстроки
  • 0Нелокальный сервер: управление корневым каталогом для поддержки короткого URL
  • 1Как установить значение месяца на основе количества
  • 0Как отобразить результаты RSS ленты в списке JQuery
  • 0$ (<input />). attr ({xxxxxxxxx}). html ();
  • 1Как написать этот тип значка при использовании текста в Android
  • 0Предотвратить событие зависания jQuery в конкретном медиа-запросе
  • 1Snakemake: Как предотвратить выполнение неоднозначных правил?
  • 1невозможно скомпилировать Java-класс, когда код взаимосвязан
  • 0как показать число, занятое пользователем, сколько времени оно вводится пользователем
  • 0вернуть все уникальные каталоги в иерархии
  • 1Что LSTM делает с состояниями в пакете? Второй элемент первого пакета наследует состояние от первого элемента первого элемента?
  • 0Текстовые блоки над изображениями
  • 0Как выбрать данные списка Python и заполнить их конкретным блоком ввода — pretype
  • 1Могу ли я экспортировать куки из python в Chrome?
  • 0массив к строке на вставке PDO
  • 0Список динамических флажков в Angular и JSON API
  • 1каковы различия между различными способами создания экземпляра JAVA_HOME в Ubuntu
  • 0Отправка значений в базу данных с помощью Python (проект SenseHAT)
  • 1Несколько графиков на одной странице, ошибка масштаба в D3.js
  • 0Как preg_match, что число делится на 6,5 с помощью регулярного выражения
  • 1System.AccessViolationException при использовании Excel.Worksheet.Copy
  • 0ClassNotFoundException Java JApplet
  • 1Сохранение объекта в базе данных приводит к следующему: «На объектный объект нельзя ссылаться несколькими экземплярами IEntityChangeTracker»
  • 1Получить все div под div с известным идентификатором и перебрать его
  • 1Шаблон посетителя, почему это полезно?

Я пробовал это в mysql:

mysql> alter table region drop column country_id;

и получил это:

ERROR 1025 (HY000): Error on rename of './product/#sql-14ae_81' to
'./product/region' (errno: 150)

какие идеи? Иностранные ключевые вещи?

12 ответов


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

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

показать создать область таблицы;

Это должно показать вам имя индекс, что-то вроде этого:

ограничения region_ibfk_1 внешняя
Ключ (country_id) ссылки
country (id) ПРИ УДАЛЕНИИ НЕТ
ДЕЙСТВИЕ ПО ОБНОВЛЕНИЮ НЕТ ДЕЙСТВИЯ

теперь просто вопрос:

alter TABLE region drop внешний ключ
region_ibfk_1;

и наконец:

alter TABLE region drop column
country_id;

и вы хорошо идти!


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

shell$ perror 150
MySQL error code 150: Foreign key constraint is incorrectly formed

чтобы узнать больше о том, что не удалось, вы можете использовать SHOW ENGINE INNODB STATUS и найдите последний раздел ошибки внешнего ключа, в котором содержатся сведения о том, что не так.

в вашем случае, это скорее всего что-то ссылается на столбец country_id.


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

Если внешний ключ существует, и вы все еще получаете эту ошибку, попробуйте следующее:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

/ / отбросьте внешний ключ здесь!

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

это всегда делает трюк для меня :)


просто запустите запрос alter table, используя » KEY «вместо» FOREIGN KEY » в инструкции drop. Я надеюсь, что это поможет решить проблему и отбросит ограничение внешнего ключа, и вы можете изменить столбцы таблицы и удалить таблицу.

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

здесь DROP KEY вместо DROP FOREIGN KEY,

надеюсь, что это поможет.

спасибо


У меня были подобные проблемы однажды. Я удалил первичный ключ из таблицы A, но когда я пытался удалить столбец внешнего ключа из таблицы B, мне была показана та же ошибка.

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


Я знаю, это старый пост, но это первый удар по любимой поисковой системе каждого, если вы ищете ошибку 1025.

тем не менее, есть простой «хак» для исправления этой проблемы:

перед выполнением команд сначала необходимо отключить проверку ограничений внешнего ключа с помощью этой команды:

SET FOREIGN_KEY_CHECKS = 0;

затем вы можете выполнить свою команду(ы).

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

SET FOREIGN_KEY_CHECKS = 1;

удачи в ваших начинаниях.


посмотрите в файле ошибок для вашей базы данных mysql. Согласно ошибка #26305 мой SQL не дает вам причину. Эта ошибка существует с MySQL 4.1; -)


Если вы используете клиент, такой как MySQL Workbench, щелкните правой кнопкой мыши нужную таблицу, из которой должен быть удален внешний ключ, затем выберите вкладку Внешний ключ и удалите индексы.

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

alter table table_name drop foreign_key_col_name;

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

чтобы узнать, какая таблица вызвала ошибку, вы можете запустить SHOW ENGINE INNODB STATUS а затем посмотрите на LATEST FOREIGN KEY ERROR раздел

используйте SHOW CREATE TABLE categories для отображения имени ограничения.

скорее всего, это будет categories_ibfk_1

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

ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1;
ALTER TABLE categories DROP COLUMN assets_id;

делаешь

SET FOREIGN_KEY_CHECKS=0;

перед операцией также может сделать трюк.


Я бы предположил, что проблема ограничения внешнего ключа. Это country_id используется в качестве внешнего ключа в другой таблице?

Я не DB guru, но я думаю, что решил такую проблему (где было ограничение fk), удалив fk, сделав мой материал alter table, а затем переделав материал fk.

Мне будет интересно услышать, каков результат-иногда mysql довольно загадочный.


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

  1. RT. нажмите на свою схему и выберите «инспектор схем». Это дает вам различные таблицы, столбцы, индексы, ect.

  2. перейдите на вкладку с именем «индексы» и найдите имя столбца под столбцом с именем «столбец». Однажды найдено проверьте имя таблицы для этой записи под именем столбца «таблица». Если он соответствует имени нужной таблицы, запишите имя внешнего ключа из столбца с именем «Name».

  3. теперь выполните запрос: ALTER table TABLENAMEXX DROP KEY foreignKeyName;

  4. теперь вы можете выполнить оператор drop, который должен успешно выполняться.


I tried this in mysql:

mysql> alter table region drop column country_id;

And got this:

ERROR 1025 (HY000): Error on rename of './product/#sql-14ae_81' to
'./product/region' (errno: 150)

Any ideas? Foreign key stuff?

OMG Ponies's user avatar

OMG Ponies

321k79 gold badges517 silver badges499 bronze badges

asked Oct 1, 2008 at 23:33

Trenton's user avatar

2

You usually get this error if your tables use the InnoDB engine. In that case you would have to drop the foreign key, and then do the alter table and drop the column.

But the tricky part is that you can’t drop the foreign key using the column name, but instead you would have to find the name used to index it. To find that, issue the following select:

SHOW CREATE TABLE region;

This should show you the name of the index, something like this:

CONSTRAINT region_ibfk_1 FOREIGN
KEY (country_id) REFERENCES
country (id) ON DELETE NO
ACTION ON UPDATE NO ACTION

Now simply issue an:

alter table region drop foreign key
region_ibfk_1;

And finally an:

alter table region drop column
country_id;

And you are good to go!

answered Apr 11, 2011 at 0:45

Jeshurun's user avatar

JeshurunJeshurun

22.7k6 gold badges80 silver badges92 bronze badges

2

It is indeed a foreign key error, you can find out using perror:

shell$ perror 150
MySQL error code 150: Foreign key constraint is incorrectly formed

To find out more details about what failed, you can use SHOW ENGINE INNODB STATUS and look for the LATEST FOREIGN KEY ERROR section it contains details about what is wrong.

In your case, it is most likely cause something is referencing the country_id column.

dmckee --- ex-moderator kitten's user avatar

answered Oct 7, 2008 at 17:24

Harrison Fisk's user avatar

Harrison FiskHarrison Fisk

7,0263 gold badges24 silver badges14 bronze badges

2

You can get also get this error trying to drop a non-existing foreign key. So when dropping foreign keys, always make sure they actually exist.

If the foreign key does exist, and you are still getting this error try the following:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

// Drop the foreign key here!

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

This always does the trick for me :)

answered Oct 22, 2009 at 8:40

Jeroen's user avatar

JeroenJeroen

1511 silver badge2 bronze badges

1

Simply run the alter table query using ‘KEY’ instead of ‘FOREIGN KEY’ in the drop statement. I hope it will help to solve the issue, and will drop the foreign key constraint and you can change the table columns and drop the table.

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

here in DROP KEY instead of DROP FOREIGN KEY,

hope it will help.

Thanks

Prahalad Gaggar's user avatar

answered Feb 21, 2013 at 8:05

Muhammad Sohail's user avatar

0

I know, this is an old post, but it’s the first hit on everyone’s favorite search engine if you are looking for error 1025.

However, there is an easy «hack» for fixing this issue:

Before you execute your command(s) you first have to disable the foreign key constraints check using this command:

SET FOREIGN_KEY_CHECKS = 0;

Then you are able to execute your command(s).

After you are done, don’t forget to enable the foreign key constraints check again, using this command:

SET FOREIGN_KEY_CHECKS = 1;

Good luck with your endeavor.

answered Jan 9, 2017 at 8:25

Baccata's user avatar

BaccataBaccata

3951 gold badge6 silver badges14 bronze badges

1

I had a similar issues once. I deleted the primary key from TABLE A but when I was trying to delete the foreign key column from table B I was shown the above same error.

You can’t drop the foreign key using the column name and to bypass this in PHPMyAdmin or with MySQL, first remove the foreign key constraint before renaming or deleting the attribute.

answered Jan 12, 2016 at 5:40

Joomler's user avatar

JoomlerJoomler

2,5102 gold badges29 silver badges37 bronze badges

Take a look in error file for your mysql database. According to Bug #26305 my sql do not give you the cause. This bug exists since MySQL 4.1 ;-)

answered Mar 16, 2010 at 16:39

marabol's user avatar

marabolmarabol

1,2472 gold badges15 silver badges22 bronze badges

1

If you are using a client like MySQL Workbench, right click the desired table from where a foreign key is to be deleted, then select the foreign key tab and delete the indexes.

Then you can run the query like this:

alter table table_name drop foreign_key_col_name;

answered Jan 8, 2013 at 20:25

iltaf khalid's user avatar

iltaf khalidiltaf khalid

9,6985 gold badges29 silver badges34 bronze badges

There is probably another table with a foreign key referencing the primary key you are trying to change.

To find out which table caused the error you can run SHOW ENGINE INNODB STATUS and then look at the LATEST FOREIGN KEY ERROR section

Use SHOW CREATE TABLE categories to show the name of constraint.

Most probably it will be categories_ibfk_1

Use the name to drop the foreign key first and the column then:

ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1;
ALTER TABLE categories DROP COLUMN assets_id;

answered Jan 11, 2016 at 13:24

youngdero's user avatar

youngderoyoungdero

3642 silver badges16 bronze badges

I got this error with MySQL 5.6 but it had nothing to do with Foreign keys. This was on a Windows 7 Professional machine acting as a server on a small LAN.

The client application was doing a batch operation that creates a table fills it with some external data then runs a query joining with permanent tables then dropping the «temporary» table. This batch does this approximately 300 times and this particular routine had been running week in week out for several years when suddenly we get the Error 1025 Unable to rename problem at a random point in the batch.

In my case the application was using 4 DDL statements a CREATE TABLE followed by 3 CREATE INDEX, there is no foreign key. However only 2 of the indexes actually get created and the actual table .frm file was renamed, at the point of failure.

My solution was to get rid of the separate CREATE INDEX statements and create them using the CREATE TABLE statement. This at the time of writing has solved the issue for me and my help someone else scratching their head when they find this thread.

answered Jan 4, 2019 at 21:27

Chris Millard's user avatar

I’d guess foreign key constraint problem. Is country_id used as a foreign key in another table?

I’m not DB guru but I think I solved a problem like this (where there was a fk constraint) by removing the fk, doing my alter table stuff and then redoing the fk stuff.

I’ll be interested to hear what the outcome is — sometime mysql is pretty cryptic.

answered Oct 1, 2008 at 23:42

itsmatt's user avatar

itsmattitsmatt

31.1k10 gold badges100 silver badges163 bronze badges

1

In my case, I was using MySQL workbench and I faced the same issue while dropping one of my columns in a table. I could not find the name of the foreign key. I followed the following steps to resolve the issue:

  1. Rt. click on your schema and select ‘schema inspector’. This gives you various tables, columns, indexes, ect.

  2. Go to the tab named ‘Indexes’ and search the name of the column under the column named ‘Column’. Once found check the name of the table for this record under the column name ‘Table’. If it matches the name of the table you want, then note down the name of the foreign key from the column named ‘Name’.

  3. Now execute the query : ALTER table tableNamexx DROP KEY foreignKeyName;

  4. Now you can execute the drop statement which shall execute successfully.

answered Feb 25, 2016 at 7:51

chepaiytrath's user avatar

chepaiytrathchepaiytrath

6381 gold badge9 silver badges20 bronze badges

Doing

SET FOREIGN_KEY_CHECKS=0;

before the Operation can also do the trick.

answered Jan 14, 2017 at 16:25

Jan Tchärmän's user avatar

Jan TchärmänJan Tchärmän

9171 gold badge8 silver badges13 bronze badges

averageRatings= FOREACH groupedRatings GENERATE group AS movieID, AVG(ratings.rating) AS avgRating, COUNT(ratings.rating) AS numRatings;

If you are using any command like above you must use group in small letters. This may solve your problem it solved mine. At least in PIG script.

answered Apr 1, 2020 at 12:00

Naman Dhameja's user avatar

1

So I am trying to add a primary key to one of the tables in my database. Right now it has a primary key like this:

PRIMARY KEY (user_id, round_number)

Where user_id is a foreign key.

I am trying to change it to this:

PRIMARY KEY (user_id, round_number, created_at)

I am doing this in phpmyadmin by clicking on the primary key icon in the table structure view.

This is the error I get:

#1025 - Error on rename of './database/#sql-2e0f_1254ba7' to './database/table' (errno: 150)

It is a MySQL database with InnoDB table engine.

OMG Ponies's user avatar

OMG Ponies

321k79 gold badges517 silver badges499 bronze badges

asked Nov 2, 2010 at 17:55

Richard Knop's user avatar

Richard KnopRichard Knop

79.5k148 gold badges390 silver badges547 bronze badges

1

There is probably another table with a foreign key referencing the primary key you are trying to change.

To find out which table caused the error you can run SHOW ENGINE INNODB STATUS and then look at the LATEST FOREIGN KEY ERROR section.

trejder's user avatar

trejder

16.9k27 gold badges122 silver badges214 bronze badges

answered Nov 2, 2010 at 18:50

Ike Walker's user avatar

Ike WalkerIke Walker

63.5k14 gold badges107 silver badges108 bronze badges

1

As was said you need to remove the FKs before. On Mysql do it like this:

ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;

ALTER TABLE `table_name` DROP INDEX `id_name_fk`;

answered Sep 4, 2013 at 21:04

Wellington Lorindo's user avatar

2

For those who are getting to this question via google… this error can also happen if you try to rename a field that is acting as a foreign key.

answered Jun 20, 2013 at 13:03

Dave C's user avatar

Dave CDave C

9053 gold badges11 silver badges28 bronze badges

To bypass this in PHPMyAdmin or with MySQL, first remove the foreign key constraint before renaming the attribute.

(For PHPMyAdmin users: To remove FK constrains in PHPMyAdmin, select the attribute then click «relation view» next to «print view» in the toolbar below the table structure)

answered Dec 1, 2013 at 5:38

LazerSharks's user avatar

LazerSharksLazerSharks

3,0493 gold badges41 silver badges67 bronze badges

1

If you are trying to delete a column which is a FOREIGN KEY, you must find the correct name which is not the column name. Eg: If I am trying to delete the server field in the Alarms table which is a foreign key to the servers table.

  1. SHOW CREATE TABLE alarm;
    Look for the CONSTRAINT `server_id_refs_id_34554433` FORIEGN KEY (`server_id`) REFERENCES `server` (`id`) line.
  2. ALTER TABLE `alarm` DROP FOREIGN KEY `server_id_refs_id_34554433`;
  3. ALTER TABLE `alarm` DROP `server_id`

This will delete the foreign key server from the Alarms table.

ItalyPaleAle's user avatar

ItalyPaleAle

7,1456 gold badges43 silver badges69 bronze badges

answered Nov 18, 2014 at 22:45

Bonnie Varghese's user avatar

Bonnie VargheseBonnie Varghese

2,1281 gold badge15 silver badges11 bronze badges

I had this problem, it is for foreign-key

Click on the Relation View (like the image below) then find name of the field you are going to remove it, and under the Foreign key constraint (INNODB) column, just put the select to nothing! Means no foreign-key

enter image description here

Hope that works!

answered Feb 29, 2016 at 6:37

Mohammad Kermani's user avatar

Mohammad KermaniMohammad Kermani

5,0727 gold badges37 silver badges60 bronze badges

If you are adding a foreign key and faced this error, it could be the value in the child table is not present in the parent table.

Let’s say for the column to which the foreign key has to be added has all values set to 0 and the value is not available in the table you are referencing it.

You can set some value which is present in the parent table and then adding foreign key worked for me.

answered Nov 18, 2016 at 7:32

StateLess's user avatar

StateLessStateLess

5,2743 gold badges20 silver badges29 bronze badges

I’m getting this error:

  • SQLSTATE[HY000]: General error: 1025 Error on rename of ‘./salt/ghost’ to ‘./salt/#sql2-4ab-630b’ (errno: 152). Failing Query:
    «ALTER TABLE ghost DROP FOREIGN KEY ghost.row_id»

I looked for some information but I didn’t get a solution..any help?

This is my DDL:

ghost,"CREATE TABLE `ghost` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `packet_number` int(11) DEFAULT NULL,
  `tbl_name` varchar(50) DEFAULT NULL,
  `row_id` int(11) DEFAULT NULL,
  `row_id2` int(11) DEFAULT NULL,
  `column_name` varchar(50) DEFAULT NULL,
  `old_value` mediumblob,
  `new_value` mediumblob,
  `ghost_action` varchar(255) DEFAULT NULL,
  `ghost_user_id` int(11) DEFAULT NULL,
  `ghost_action_comments` varchar(255) DEFAULT NULL,
  `ghost_status_id` int(11) DEFAULT '1',
  `ghost_status_comments` varchar(255) DEFAULT NULL,
  `serialized` mediumblob,
  `parent_id` int(11) DEFAULT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  `created_by` bigint(20) DEFAULT NULL,
  `updated_by` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_change_1_idx` (`ghost_user_id`),
  KEY `fk_change_2_idx` (`ghost_status_id`),
  KEY `row_id2_idx` (`row_id2`),
  CONSTRAINT `ghost_ghost_status_id_ghost_status_id` FOREIGN KEY (`ghost_status_id`) REFERENCES `ghost_status` (`id`),
  CONSTRAINT `ghost_ghost_user_id_sf_guard_user_id` FOREIGN KEY (`ghost_user_id`) REFERENCES `sf_guard_user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=120450 DEFAULT CHARSET=utf8"

Javi

Problem

An attempt of repairing collation and character set on table level (MySQL database) resulted in the following errors.

ERROR 1025 (HY000): Error on rename of './confluence/#sql-23f9_59586' to './confluence/logininfo' (errno: 150)

Diagnosis

Execute the following command against your MySQL database to get more detailed information on the error.

show engine innodb status;

You should be seeing an error similar to the one shown below:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
151026  2:07:01 Error in foreign key constraint of table confluence/logininfo:
there is no index in the table which would contain
the columns as the first columns, or the data types in the
table do not match the ones in the referenced table
or one of the ON ... SET NULL columns is declared NOT NULL. Constraint:
,
  CONSTRAINT "FK_logininfo_USERNAME" FOREIGN KEY ("USERNAME") REFERENCES "user_mapping" ("user_key")

Cause

Referential integrity (foreign key constrains check) failed while attempting to change the table’s collation and character set.

For more information, please refer to this link.

Workaround

Temporarily disable the foreign key constraints check when altering the table collation by executing the following queries before and after the alter attempt itself:

Disable Foreign Key Constraints

SET FOREIGN_KEY_CHECKS=0;

Reattempt to change the collation and character set for a particular table

ALTER TABLE `tableName` CHARACTER SET utf8 COLLATE utf8_bin

Enable back the Foreign Key Constraints

SET FOREIGN_KEY_CHECKS=1;

tip/resting
Created with Sketch.

Please do take note to generate a full backup of your Confluence database before then proceed with the suggested workaround as preventive measures.

Last modified on Nov 12, 2018

Related content

  • No related content found

12 ответов

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

Но сложная часть заключается в том, что вы не можете удалить внешний ключ, используя имя столбца, но вместо этого вам нужно будет найти имя, используемое для его индексации. Чтобы найти это, выполните следующие действия:

ПОКАЗАТЬ СОЗДАТЬ область ТАБЛИЦЫ;

Это должно показать вам имя индекса, что-то вроде этого:

CONSTRAINT region_ibfk_1 ИНОСТРАННЫЙ КЛЮЧ (country_id) ССЫЛКИ country (id) ON УДАЛИТЬ НЕТ ACTION ON UPDATE NO ACTION

Теперь просто выпустите:

изменить внешний вид таблицы регистров region_ibfk_1;

И наконец:

изменить столбец падения таблицы таблицы COUNTRY_ID;

И тебе хорошо идти!

Jeshurun
11 апр. 2011, в 02:12

Поделиться

Это действительно ошибка внешнего ключа, вы можете узнать, используя perror:

shell$ perror 150
MySQL error code 150: Foreign key constraint is incorrectly formed

Чтобы узнать более подробную информацию о том, что не удалось, вы можете использовать SHOW ENGINE INNODB STATUS и найти раздел LATEST FOREIGN KEY ERROR, содержащий подробные сведения о том, что не так.

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

Harrison Fisk
07 окт. 2008, в 17:53

Поделиться

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

Если внешний ключ существует и вы все еще получаете эту ошибку, попробуйте следующее:

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL';

//Оставьте здесь иностранный ключ!

SET [email protected]_SQL_MODE;
SET [email protected]_FOREIGN_KEY_CHECKS;
SET [email protected]_UNIQUE_CHECKS;

Это всегда делает трюк для меня:)

Jeroen
22 окт. 2009, в 10:36

Поделиться

Просто запустите запрос alter table, используя «KEY» вместо «FOREIGN KEY» в инструкции drop. Я надеюсь, что это поможет решить проблему, и упустит ограничение внешнего ключа, и вы можете изменить столбцы таблицы и отбросить таблицу.

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

здесь, в DROP KEY вместо DROP FOREIGN KEY,

надеюсь, что это поможет.

Спасибо

Sohail
21 фев. 2013, в 08:52

Поделиться

Выполнение

SET FOREIGN_KEY_CHECKS=0;

до того, как Операция также может выполнить трюк.

Jan Tchärmän
14 янв. 2017, в 18:02

Поделиться

Я знаю, это старый пост, но это первый удар по каждой любимой поисковой системе, если вы ищете ошибку 1025.

Однако для устранения этой проблемы существует простой «взлом»:

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

SET FOREIGN_KEY_CHECKS = 0;

Затем вы можете выполнить свои команды.

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

SET FOREIGN_KEY_CHECKS = 1;

Удачи вам в ваших усилиях.

Baccata
09 янв. 2017, в 09:41

Поделиться

У меня были похожие проблемы один раз. Я удалил первичный ключ из таблицы A, но когда я пытался удалить столбец внешнего ключа из таблицы B, мне была показана вышеприведенная ошибка.

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

Joomler
12 янв. 2016, в 06:34

Поделиться

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

Чтобы узнать, какая таблица вызвала ошибку, вы можете запустить SHOW ENGINE INNODB STATUS, а затем посмотреть раздел LATEST FOREIGN KEY ERROR

Используйте категории SHOW CREATE TABLE, чтобы показать имя ограничения.

Скорее всего, это будут категории_ibfk_1

Используйте имя, чтобы сначала удалить внешний ключ и столбец:

ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1;
ALTER TABLE categories DROP COLUMN assets_id;

youngdero
11 янв. 2016, в 14:47

Поделиться

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

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

alter table table_name drop foreign_key_col_name;

iltaf khalid
08 янв. 2013, в 21:48

Поделиться

Взгляните в файл ошибки для вашей базы данных mysql. Согласно Ошибка № 26305 мой sql не дает вам причины. Эта ошибка существует с MySQL 4.1; -)

marabol
16 март 2010, в 17:34

Поделиться

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

  • Rt. нажмите на свою схему и выберите «инспектор схемы». Это дает вам различные таблицы, столбцы, индексы, ect.

  • Перейдите на вкладку с названием «Индексы» и найдите имя столбца под столбцом «Столбец». После обнаружения проверьте имя таблицы для этой записи под именем столбца «Таблица». Если он совпадает с именем нужной таблицы, запишите имя внешнего ключа из столбца с именем «Имя».

  • Теперь выполните запрос: ALTER table tableNamexx DROP KEY foreignKeyName;

  • Теперь вы можете выполнить оператор drop, который должен успешно выполняться.

Jatin Shashoo
25 фев. 2016, в 09:32

Поделиться

Я бы предположил проблему ограничения внешнего ключа. Используется ли country_id в качестве внешнего ключа в другой таблице?

Я не DB гуру, но я думаю, что я решил проблему вроде этого (там, где было ограничение fk), удалив fk, выполнив свой файл alter table, а затем переделав файл fk.

Мне будет интересно узнать, каков результат — иногда mysql довольно загадочный.

itsmatt
02 окт. 2008, в 00:32

Поделиться

Ещё вопросы

  • 0Как это можно изменить, чтобы показать 2 видео?
  • 0Загрузить контроллер angularJs
  • 1Как программно получить идентификатор рейса DroneDeploy для плана?
  • 0CSS + высота запроса
  • 1Ошибка компиляции Java в NetBeans
  • 0onMouseOut в отце вызывается, когда onMouseOver в дочернем
  • 1обратный вызов службы Android
  • 0Методы CodeIgniter не будут загружаться в Openshift
  • 1Как получить элемент ListView с помощью Android onItemClick?
  • 0Ошибка времени выполнения с матрицей, реализованной 2d Vector
  • 0Включить только var из одного файла php в другой
  • 0Как проверить поле ввода флажок со значением при загрузке страницы, используя jquery
  • 0Часы JavaScript не отображаются правильно
  • 1Проблема с NinePatchDrawable
  • 0Как оформить определенный тд в каждой третьей строке таблицы?
  • 0ООП — есть ли недостатки в использовании статических методов?
  • 1MediaPlayer на Android играет только часть моей песни :(
  • 0Как конвертировать закодированную базу 64 в UTF-16LE в javascript / jquery
  • 1Python pandas: добавление информации из словаря в строки во время циклического перебора данных
  • 0Проблема с привязкой данных из Модального диалога к другой области веб-приложения
  • 0проверить строку с регулярными выражениями для некоторого значения
  • 0angular-translate не работает с шаблонами
  • 0загрузить JQuery во внешний файл JavaScript
  • 1ipywidgets с участками Seaborn PairGrid
  • 1Maven выбирает неправильную дубликатную зависимость
  • 1Как устранить ошибки пути BindingExpression в выходных данных отладки, которые не влияют на приложение WPF?
  • 1Расписание и вручную запустить скрипт .pyw в планировщике задач в Windows
  • 1Последовательность вызовов методов при создании пользовательских компонентов
  • 1Как разрешить каскадное удаление в Hibernate?
  • 0Относительный месяц PHP не дает ожидаемого результата
  • 1Почему мой враг атакует после его смерти? (Javascript)
  • 1извлечение из вложенного JSON с Python
  • 1Панда — сдвиг временных рядов по группам
  • 1Получение настроек телефона
  • 0Реализация развертывания и свертывания в представлениях Rails
  • 1Веб-приложение для Flask на PythonAnywhere.com: модуль с именем ‘flask_app’ отсутствует
  • 1QThread не обновляет представление событиями
  • 1Помогает с появлением спрайта, столкновением спрайта и отображением очков
  • 1Проблема с установкой discord.py 1.0
  • 1поиск записи Hbase с использованием API Java?
  • 0Слушатели событий не работают для Ustream API
  • 0Можно сделать изображение повторяться горизонтально, не будучи фоновым изображением
  • 1Измените чувствительность масштабирования в ткани.js
  • 0QTableWidget, заполненный QLineEdits, не запускает сигналы
  • 0Изменить цвет фона выбранного элемента li
  • 0Как показать-скрыть именованное представление в angular-ui-router
  • 1PInvoke DnsQueryEx Async
  • 0Можно ли изменить состояние (обновить адресную строку) и перезагрузить только определенный вид с помощью ui-маршрутизатора Angular?
  • 1Слушайте прокрутки на Framer ScrollComponent
  • 1Установка даты / таймера в узле

Description:

php artisan migrate command fails for MariaDB, but working fine for MySQL.
I’d tried to migrate from MySQL to MariaDB and I stuck because I can’t execute Laravel migrations.

Each migration contains code like

    Schema::create('articles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');

            $table->foreign('user_id')
                ->references('id')
                ->on('users')
                ->onDelete('cascade');
        });

Fails with error like
SQLSTATE[HY000]: General error: 1025 Error on rename of './db/articles' to './db/#sql2-1-11c' (errno: 168 "Unknown (generic) error from engine") (SQL: alter table `articles` add constraint `articles_user_id_foreign` foreign key (`user_id`) references `users` (`id`) on delete cascade)

This can be fixed by wrapping all the code above with:

 Schema::disableForeignKeyConstraints();
// all the code above
 Schema::enableForeignKeyConstraints();

which is not so good, but something.

But in the next migration file, I have a code like

Schema::create('article_tag', function (Blueprint $table) {
            $table->unsignedBigInteger('article_id');
            $table->unsignedBigInteger('tag_id');

            $table->primary(['article_id', 'tag_id']);

            $table->foreign('article_id')
                ->references('id')
                ->on('articles')
                ->onDelete('cascade');

            $table->foreign('tag_id')
                ->references('id')
                ->on('tags')
                ->onDelete('cascade');
        });

Which fails with a different error
SQLSTATE[HY000] [2002] Connection refused (SQL: alter table `article_tag` add primary key `article_tag_article_id_tag_id_primary`(`article_id`, `tag_id`))

And laradock_mariadb_1 container crashes and I have to remove .laradock/data/mariadb folder to get it working again

Expected Behavior:

Alter SQL queries for MariaDB working as expected, the same as for MySQL, so that it’s possible to use MariaDB

Context information:

Output of git rev-parse HEAD

c670d5f98b88aedae8fff4db77790203c0a9cbca

Output of docker version

Client: Docker Engine - Community
 Version:           19.03.5
 API version:       1.40
 Go version:        go1.12.12
 Git commit:        633a0ea
 Built:             Wed Nov 13 07:22:37 2019
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.5
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.12
  Git commit:       633a0ea
  Built:            Wed Nov 13 07:29:19 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

Output of docker-compose version

docker-compose version 1.25.4, build 8d51620a
docker-py version: 4.1.0
CPython version: 3.7.4
OpenSSL version: OpenSSL 1.1.1c  28 May 2019

System info: Mac, Windows or Linux. Include which disto/version

Steps to reproduce the issue:

  1. Create a project based on laradock + Laravel 6.2 with MySQL DB
  2. Change DB_HOST to mariadb, change PMA_DB_ENGINE to mariadb
    3. docker-compose up -d nginx mariadb phpmyadmin
  3. create db using artisan command or using PhpMyAdmin
  4. php artisan migrate

Stacktrace & Additional info:

1) **Laravel version**: 6.2
2) The same behavior if I run queries using PhpMyAdmin
3) MariaDB image version 10.4.12, also tried next versions: 10.1, 10.2, 10.5.1-bionic
4) logs

laradock_mariadb_1.log
laradock_mariadb_1_rename.log

Дата: 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. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в бумажных изданиях допускается только с разрешения редакции.

Я пробовал это в mysql:

mysql> alter table region drop column country_id;

и получил это:

ERROR 1025 (HY000): Error on rename of './product/#sql-14ae_81' to
'./product/region' (errno: 150)

какие идеи? Иностранные ключевые вещи?

12 ответов


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

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

показать создать область таблицы;

Это должно показать вам имя индекс, что-то вроде этого:

ограничения region_ibfk_1 внешняя
Ключ (country_id) ссылки
country (id) ПРИ УДАЛЕНИИ НЕТ
ДЕЙСТВИЕ ПО ОБНОВЛЕНИЮ НЕТ ДЕЙСТВИЯ

теперь просто вопрос:

alter TABLE region drop внешний ключ
region_ibfk_1;

и наконец:

alter TABLE region drop column
country_id;

и вы хорошо идти!


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

shell$ perror 150
MySQL error code 150: Foreign key constraint is incorrectly formed

чтобы узнать больше о том, что не удалось, вы можете использовать SHOW ENGINE INNODB STATUS и найдите последний раздел ошибки внешнего ключа, в котором содержатся сведения о том, что не так.

в вашем случае, это скорее всего что-то ссылается на столбец country_id.


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

Если внешний ключ существует, и вы все еще получаете эту ошибку, попробуйте следующее:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

/ / отбросьте внешний ключ здесь!

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

это всегда делает трюк для меня :)


просто запустите запрос alter table, используя » KEY «вместо» FOREIGN KEY » в инструкции drop. Я надеюсь, что это поможет решить проблему и отбросит ограничение внешнего ключа, и вы можете изменить столбцы таблицы и удалить таблицу.

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

здесь DROP KEY вместо DROP FOREIGN KEY,

надеюсь, что это поможет.

спасибо


У меня были подобные проблемы однажды. Я удалил первичный ключ из таблицы A, но когда я пытался удалить столбец внешнего ключа из таблицы B, мне была показана та же ошибка.

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


Я знаю, это старый пост, но это первый удар по любимой поисковой системе каждого, если вы ищете ошибку 1025.

тем не менее, есть простой «хак» для исправления этой проблемы:

перед выполнением команд сначала необходимо отключить проверку ограничений внешнего ключа с помощью этой команды:

SET FOREIGN_KEY_CHECKS = 0;

затем вы можете выполнить свою команду(ы).

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

SET FOREIGN_KEY_CHECKS = 1;

удачи в ваших начинаниях.


посмотрите в файле ошибок для вашей базы данных mysql. Согласно ошибка #26305 мой SQL не дает вам причину. Эта ошибка существует с MySQL 4.1; -)


Если вы используете клиент, такой как MySQL Workbench, щелкните правой кнопкой мыши нужную таблицу, из которой должен быть удален внешний ключ, затем выберите вкладку Внешний ключ и удалите индексы.

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

alter table table_name drop foreign_key_col_name;

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

чтобы узнать, какая таблица вызвала ошибку, вы можете запустить SHOW ENGINE INNODB STATUS а затем посмотрите на LATEST FOREIGN KEY ERROR раздел

используйте SHOW CREATE TABLE categories для отображения имени ограничения.

скорее всего, это будет categories_ibfk_1

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

ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1;
ALTER TABLE categories DROP COLUMN assets_id;

делаешь

SET FOREIGN_KEY_CHECKS=0;

перед операцией также может сделать трюк.


Я бы предположил, что проблема ограничения внешнего ключа. Это country_id используется в качестве внешнего ключа в другой таблице?

Я не DB guru, но я думаю, что решил такую проблему (где было ограничение fk), удалив fk, сделав мой материал alter table, а затем переделав материал fk.

Мне будет интересно услышать, каков результат-иногда mysql довольно загадочный.


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

  1. RT. нажмите на свою схему и выберите «инспектор схем». Это дает вам различные таблицы, столбцы, индексы, ect.

  2. перейдите на вкладку с именем «индексы» и найдите имя столбца под столбцом с именем «столбец». Однажды найдено проверьте имя таблицы для этой записи под именем столбца «таблица». Если он соответствует имени нужной таблицы, запишите имя внешнего ключа из столбца с именем «Name».

  3. теперь выполните запрос: ALTER table TABLENAMEXX DROP KEY foreignKeyName;

  4. теперь вы можете выполнить оператор drop, который должен успешно выполняться.


Понравилась статья? Поделить с друзьями:
  • 102100 ошибка мерседес
  • 1018 ошибка лада гранта
  • 1018 ошибка калина
  • 10170 ошибка опель астра h расшифровка
  • 1017 ошибка эвотор