Ошибка 1681 mysql как исправить

I’m getting this warning when importing mysql dumps in phpMyAdmin:

Warning: #1681 Integer display width is deprecated and will be removed in a future release.

I found this on https://dev.mysql.com/worklog/task/?id=13127

Deprecate the ZEROFILL attribute for numeric data types and the display width attribute for integer types.

but i don’t really understand what it means. Can someone explain what is the problem generating this warning, and how to resolve it.

asked Nov 19, 2019 at 16:09

Szekelygobe's user avatar

1

Check this Numeric Type Attributes for the much complete story:

MySQL supports an extension for optionally specifying the display width of integer data types in parentheses following the base keyword for the type. For example, INT(4) specifies an INT with a display width of four digits. This optional display width may be used by applications to display integer values having a width less than the width specified for the column by left-padding them with spaces. (That is, this width is present in the metadata returned with result sets. Whether it is used is up to the application.)

The display width does not constrain the range of values that can be stored in the column. Nor does it prevent values wider than the column display width from being displayed correctly. For example, a column specified as SMALLINT(3) has the usual SMALLINT range of -32768 to 32767, and values outside the range permitted by three digits are displayed in full using more than three digits.

So it shall be safe to ignore these kind of warning up to current version of MySQL (8.0.17 as of writing).

If you’d like to avoid these warnings and play safe, update all your affected tables having column type definitions of something like INT(##) to INT (i.e. without explicitly specifying the display width).

Community's user avatar

answered Dec 1, 2019 at 7:23

carusyte's user avatar

carusytecarusyte

1,50917 silver badges21 bronze badges

5

It means you should not specify the width of an integer value. Just write it as only int, not int(5).

Mark Rotteveel's user avatar

answered Apr 2, 2021 at 7:06

Ronak Raj's user avatar

Ronak RajRonak Raj

1811 silver badge2 bronze badges

The warning applies to all INT types: INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT. It means in future MySQL releases there will be no need to specify display length.

In my case it was TINYINT(1) that triggered the warning.

To prevent the warning, do:
is_duplicate TINYINT instead of is_duplicate TINYINT(1)

answered Mar 25, 2022 at 14:07

Banty's user avatar

BantyBanty

4035 silver badges8 bronze badges

1

Я получаю это предупреждение при импорте дампов MySQL в phpMyAdmin:

Warning: #1681 Integer display width is deprecated and will be removed in a future release.

Я нашел это на https://dev.mysql.com/worklog/task/?id = 13127

Deprecate the ZEROFILL attribute for numeric data types and the display width attribute for integer types.

Но я не очень понимаю, что это значит. Может кто-нибудь объяснить, в чем заключается проблема, генерирующая это предупреждение, и как ее решить.

2 ответа

Лучший ответ

Ознакомьтесь с числовыми атрибутами типа, чтобы получить более полную информацию. сказка:

MySQL поддерживает расширение для необязательного указания ширины отображения целочисленных типов данных в скобках после базового ключевого слова для типа. Например, INT (4) определяет INT с шириной отображения четырех цифр. Эта необязательная ширина отображения может использоваться приложениями для отображения целочисленных значений, ширина которых меньше ширины, указанной для столбца, путем добавления их слева с пробелами. (То есть эта ширина присутствует в метаданных, возвращаемых с наборами результатов. Будет ли она использоваться, зависит от приложения.)

Ширина отображения не ограничивает диапазон значений, которые могут быть сохранены в столбце. Также это не препятствует правильному отображению значений, более широких, чем ширина отображения столбца. Например, столбец, указанный как SMALLINT (3), имеет обычный диапазон SMALLINT от -32768 до 32767, а значения, выходящие за пределы диапазона, разрешенного тремя цифрами, отображаются полностью, используя более трех цифр.

Поэтому будет безопасно игнорировать подобные предупреждения до текущей версии MySQL (8.0.17 на момент написания).

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


46

Community
20 Июн 2020 в 12:12

Это означает, что вы не должны указывать ширину целочисленного значения. Просто напишите это как int, а не int(5).


7

Mark Rotteveel
2 Апр 2021 в 16:42

MySQL Version

MySQL Version: 8.0.18

SQL Script (with warning)

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `role` varchar(50) CHARACTER SET latin1 NOT NULL COMMENT 'Role',
  `active` tinyint(1) NOT NULL COMMENT 'Active',
  PRIMARY KEY (`id`)
)
ENGINE = InnoDB
DEFAULT CHARSET=utf8
COMMENT = 'User';

warning: 1681 Integer display width is deprecated and will be removed in a future release.

Cause Analysis

Create a tableINT(M)This use is an extension attribute.MIndicates the display width of the integer data type (display width

For floating point and fixed-point data types, m represents the total number of bits that can be stored.

For example, int (4) specifies that the INT display width is four digits. The application uses an optional display width to display an integer value, the width of the integer value is less than the width specified by the column, and the method is to populate the left mock button. If the number of digits inserted is greater than the value of the displayed width M, the value can still be inserted, and the original number is displayed. Such as Year Int [4], Year value is 12345, then 12345 is still displayed.

Starting from MySQL 8.0.17, for integer data types, it is not recommended to use the Display Width property, ie, no m display width, and will delete it in the future MySQL version.

Reference official documentation:https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html

solution

willINT(M)Change toINT。

SQL Script (resolve warning)

CREATE TABLE `user` (
  `id` INTEGER NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `role` VARCHAR(50) CHARACTER SET latin1 NOT NULL COMMENT 'Role',
  `active` TINYINT NOT NULL COMMENT 'Active',
  PRIMARY KEY (`id`)
)
ENGINE = InnoDB
DEFAULT CHARSET=utf8
COMMENT = 'User';

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

Pick a username
Email Address
Password

By clicking “Sign up for GitHub”, you agree to our terms of service and
privacy statement. We’ll occasionally send you account related emails.

Already on GitHub?
Sign in
to your account

Я создал таблицы в MySQL Workbench, как показано ниже:

Таблица ORDRE:


Таблица PRODUKT:


а также Таблица ORDRELINJE:


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

Код ошибки: 1452. Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено (., ОГРАНИЧЕНИЕ ИНОСТРАННЫЙ КЛЮЧ () ССЫЛКИ ())

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

  • 3 возможных дубликата ошибки Mysql 1452 — невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется

Взято из использования ограничений FOREIGN KEY

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

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

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

Сначала необходимо вставить строку в таблицу .

  • Или мы можем удалить внешний ключ, а затем добавить внешний ключ после вставки данных?
  • @VamsiPavanMahesh, НЕТ, потому что даже если ты это сделаешь; создание вашего внешнего ключа не удастся с такой же ошибкой, так как будет несоответствие ключевых данных.
  • 4 Проще говоря, если у детей определены идентификаторы родителей, эти родители должны существовать. И я подумал, что у меня неправильный синтаксис … Это мне очень помогло. Спасибо!
  • 2 А как насчет необязательных отношений?

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

Чтобы вставить значение в , вам сначала нужно ввести значение в таблицу и использовать тот же в таблице .

Или вы можете удалить ненулевое ограничение и вставить в него значение NULL.

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

  • 1 Это правильно, перед вставкой данных в сводную таблицу (имеющую ограничения CASCADE) вы должны вставить данные в родительские таблицы. например 1-я таблица — разрешения; 2-я таблица — роли; 3-я таблица — permission_role; Итак, первая вставка в таблицу разрешений, вторая вставка в таблицу ролей и, наконец, вставка в таблицу permission_role.

Проблема связана с ограничением FOREIGN KEY. По умолчанию (SET FOREIGN_KEY_CHECKS = 1). Параметр FOREIGN_KEY_CHECKS указывает, следует ли проверять ограничения внешнего ключа для таблиц InnoDB. MySQL — УСТАНОВИТЬ FOREIGN_KEY_CHECKS

Мы можем отключить проверку внешнего ключа перед запуском запроса. Отключить внешний ключ.

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

1) Для сеанса (рекомендуется)


2) Глобально


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

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

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


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

  1. Основываясь на вашей «бизнес-логике», вам нужно будет обновить / сопоставить эти несоответствующие значения с существующими значениями в родительской таблице. Иногда вам может потребоваться также установить их .
  2. Удалите эти строки с несоответствующими значениями.
  3. Добавьте новые строки в родительскую таблицу, соответствующие несоответствующим значениям в дочерней таблице.

Как только данные зафиксированы, мы можем применить ограничение внешнего ключа, используя синтаксис .

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

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

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

Что сработало для меня, так это набрать код «SET GLOBAL FOREIGN_KEY_CHECKS = 0». После этого я закрыл MySQL, а затем перезапустил его, и я смог загрузить все свои данные без ошибок. Затем я набрал «SET GLOBAL FOREIGN_KEY_CHECKS = 1», чтобы вернуть систему в нормальное состояние, хотя я не совсем уверен, что делает FOREIGN_KEY_CHECKS. Надеюсь это поможет!

  • Разве это не то, что уже было предложено в ответе @ Mr-Faizan? Если нет, то объясните, что добавляет ваш ответ.

Это можно исправить, вставив сначала соответствующие записи в родительскую таблицу, а затем мы можем вставить записи в соответствующий столбец дочерней таблицы. Также проверьте тип данных и размер столбца. Он должен быть таким же, как столбец родительской таблицы, даже механизм и сопоставление также должны быть такими же. ПОПРОБУЙ ЭТО! Вот как я решил свою. Поправьте меня, если ошибаюсь.

Это помогло мне после прочтения ответов @ Mr-Faizan и других.

Снимите флажок «Включить проверку внешнего ключа».

в phpMyAdmin и нажмите запрос. Я не знаю о WorkBench, но другие ответы могут вам помочь.

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

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

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

Надеюсь, я прояснил это.

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

вы должны добавить данные из REFERENCES KEY в PRIMARY TABLE к FOREIGN KEY в CHILD TABLE
это означает, что не добавляйте случайные данные во внешний ключ ، Просто используйте данные из первичного ключа, которые доступны

описание данных во внешнем ключе

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

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

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

Например, если вы добавляете в Таблица 1 от Таблица 2 затем из Таблица 2 порядок должен быть таким же и не как , где — внешний ключ в Таблица 2 из Таблица 1.

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

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

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

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

В моем случае таблицы были идеально согласованы.

В любом случае я получал эту ошибку, потому что создал (случайно) более одного ограничения FK для одного и того же поля.

Я запускаю следующий запрос, чтобы показать все ключи:


и я удалил неправильные с помощью следующего запроса:


Вы можете проверить это также, выполнив этот запрос:


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

Он был отклонен с сообщением:

Я экспортировал данные из таблицы ORDERS, затем удалил из нее все данные, снова запустил команду, на этот раз она сработала, затем повторно вставила данные с соответствующими из таблицы USERS.

Его 100% рабочий …

ОШИБКА 1452: Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не работает …. если возникает этот тип ошибки: то в первую очередь перейдите к этой таблице и проверьте настройку>, если Engine: InnoDB, затем измените ее на MyISAM

(и удалить ссылки внешнее ограничение)

Понравилась статья? Поделить с друзьями:
  • Ошибка 16804 шкода октавия bse
  • Ошибка 168 4 додж караван
  • Ошибка 16795 на ауди а4
  • Ошибка 16785 фольксваген гольф 4
  • Ошибка 16727 ауди а4 б6