Общая ошибка: 1364 с отключенным STRICT_TRANS_TABLES

У меня есть сервер Mariadb 10.2.26 с отключенным режимом STRICT_TRANS_TABLES. Включен только режим "NO_ENGINE_SUBSTITUTION". Но даже в этом случае я получаю «Общая ошибка: поле 1364» не имеет значения по умолчанию». Кто-нибудь знает, почему? Спасибо.


person user3199269    schedule 27.08.2019    source источник
comment
Укажите SHOW CREATE TABLE.. для соответствующей таблицы.   -  person Madhur Bhaiya    schedule 27.08.2019
comment
Когда вы получаете эту ошибку (вставка, обновление?) И какова ваша инструкция вставки, обновления?   -  person P.Salmon    schedule 27.08.2019
comment
Я получаю это на простом запросе на вставку. Создание таблицы и оператор, я думаю, здесь неуместны, так как это старая таблица с более чем 100 полями, многие из которых не имеют значений по умолчанию и не могут быть обнулены. Вот почему я пытаюсь избежать этой ошибки с помощью настроек sql_mode. Проблема в том, почему я все еще получаю сообщение об ошибке 1364 даже с отключенным STRICT_TRANS_TABLES.   -  person user3199269    schedule 27.08.2019
comment
если ваше решение состоит в том, чтобы изменить sql_mode, чтобы заставить запрос работать, вы выбираете очень неправильный подход. Также отключенный STRICT_TRANS_TABLES (строгий режим) вызывает проблемы..   -  person Raymond Nijland    schedule 27.08.2019
comment
Я согласен. Но мне приходится работать с большой старой базой данных, в которой в этой ситуации почти 400 таблиц с более чем 2000 полей. Я предпочитаю использовать этот подход сейчас, чтобы завершить свой проект, чем тратить недели на то, чтобы сначала исправить БД.   -  person user3199269    schedule 27.08.2019


Ответы (1)


Вот небольшой пример «несовместимых изменений», сделанных за эти годы.

----- 25.09.2014 5.7.5 Веха 15 -- Примечания по режиму SQL -- Несовместимое изменение -----

Эти изменения режима SQL были сделаны:

Strict SQL mode for transactional storage engines ([STRICT_TRANS_TABLES](http://dev.mysql.comhttps://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_strict_trans_tables))

теперь включен по умолчанию.

Implementation of the [ONLY_FULL_GROUP_BY](http://dev.mysql.comhttps://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by)

Режим SQL стал более сложным, чтобы больше не отклонять детерминированные запросы, которые ранее отклонялись.

    MySQL now recognizes when a nonaggregated selected column is functionally dependent on (uniquely determined by) GROUP BY columns.

    MySQL has an extension to standard SQL that permits references in the HAVING clause to aliased expressions in the select list.

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

In consequence, [ONLY_FULL_GROUP_BY](http://dev.mysql.comhttps://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by)

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

The changes to the default SQL mode result in a default [sql_mode](http://dev.mysql.comhttps://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_sql_mode)

значение системной переменной с этими включенными режимами: ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ENGINE_SUBSTITUTION.

The [ONLY_FULL_GROUP_BY](http://dev.mysql.comhttps://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by)

режим теперь включен в режимы, содержащиеся в ANSI режим SQL.

A new function, ANY_VALUE(), is available that can be used to force MySQL to accept queries that it thinks should be rejected with

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

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

If it is possible to modify an offending query, do so, either so that nondeterministic nonaggregated columns are functionally dependent

в столбцах GROUP BY или ссылаясь на неагрегированные столбцы с помощью ЛЮБОЕ_ЗНАЧЕНИЕ().

If it is not possible to modify an offending query (for example, if it is generated by a third-party application), set the sql_mode

системная переменная при запуске сервера, чтобы не включать ONLY_FULL_GROUP_BY.

Дополнительные сведения о режимах SQL и запросах GROUP BY см. в разделе Режимы SQL сервера и Обработка MySQL GROUP BY. (Ошибка № 18486310)

----- 31-03-2014 5.7.4 Веха 14 -- Функциональность добавлена ​​или изменена -- Несовместимое изменение -----

Устаревший ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE и NO_ZERO_IN_DATE Режимы SQL теперь ничего не делают. Вместо этого их предыдущие эффекты включены в эффекты строгого режима SQL (STRICT_ALL_TABLES или STRICT_TRANS_TABLES). Другими словами, строгий режим теперь означает то же самое, что и предыдущее значение строгого режима, плюс ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE и NO_ZERO_IN_DATE. Это изменение уменьшает количество режимов SQL с эффектом, зависящим от строгого режима, и делает их частью самого строгого режима.

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

Устаревший ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE и NO_ZERO_IN_DATE Режимы SQL по-прежнему распознаются, поэтому операторы, которые их называют, не вызывают ошибки, но будут удалены в будущей версии MySQL. Чтобы заранее подготовиться к версиям MySQL, в которых эти режимы не существуют, приложения должны быть изменены, чтобы они не ссылались на имена этих режимов.

----- 27-03-2014 5.6.17 Общая доступность -- Примечания к режиму SQL -- Несовместимое изменение -----

ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE и NO_ZERO_IN_DATE Режимы SQL теперь устарели, и установка значения sql_mode для включения любого из них генерирует предупреждение. В MySQL 5.7 эти режимы ничего не делают. Вместо этого их эффекты включены в эффекты строгого режима SQL (STRICT_ALL_TABLES или STRICT_TRANS_TABLES). Мотивация изменения в MySQL 5.7 состоит в том, чтобы уменьшить количество режимов SQL с эффектом, зависящим от строгого режима, и сделать их частью самого строгого режима.

Чтобы заранее подготовиться к обновлению до MySQL 5.7, см. Изменения режима SQL в MySQL 5.7. В этом обсуждении содержатся рекомендации по оценке того, повлияют ли на ваши приложения изменения режима SQL в MySQL 5.7.

----- 05.02.2013 5.6.10 Общая доступность -- Исправлены ошибки -- InnoDB -----

Во время онлайн-DDL изменение столбца с нулевого на NOT NULL может быть успешным или неудачным по-разному в зависимости от того, используется ли ALTER TABLE используется оператор ALGORITHM=INPLACE или ALGORITHM=COPY. Операция с ALGORITHM=COPY завершится успешно, даже если столбец содержит значения NULL, а операция с ALGORITHM=INPLACE завершится ошибкой из-за возможности того, что столбец содержит значения NULL. Теперь создание столбца NOT NULL в сочетании с предложением ALGORITHM=INPLACE разрешено, но только если sql_mode включает STRICT_TRANS_TABLES или STRICT_ALL_TABLES. Если предложение ALGORITHM не указано с ALTER TABLE, онлайн-операция DDL будет использовать ALGORITHM=INPLACE, если возможно, или ALGORITHM=COPY, если нет. (Ошибка № 15961327)

----- 2012-11-07 5.6.8 Версия-кандидат -- Примечания по установке -- -----

На платформах Unix mysql_install_db теперь создает файл параметров по умолчанию с именем my.cnf в базовом каталоге установки. Этот файл создается на основе шаблона, включенного в дистрибутив с именем my-default.cnf. Вы можете найти шаблон в базовом каталоге установки или в нем. При запуске с mysqld_safe сервер по умолчанию использует файл my.cnf. Если файл my.cnf уже существует, mysql_install_db предполагает, что он уже используется, и записывает вместо него новый файл с именем my-new.cnf.

За одним исключением, настройки в файле опций по умолчанию закомментированы и не действуют. Исключением является то, что файл изменяет sql_mode вместо значения по умолчанию NO_ENGINE_SUBSTITUTION, чтобы также включить STRICT_TRANS_TABLES:

sql_mode = NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES

Этот параметр создает конфигурацию сервера, которая приводит к ошибкам, а не к предупреждениям о неверных данных в операциях, изменяющих транзакционные таблицы. См. раздел Режимы SQL сервера.

Шаблон my-default.cnf заменяет старые примеры файлов параметров (my-small.cnf, my-medium.cnf и т. д.), которые больше не распространяются.

----- 2004-12-01 5.0.2 -- Добавлены или изменены функциональные возможности -- -----

Добавлены STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO и ТРАДИЦИОННЫЕ режимы SQL. ТРАДИЦИОННЫЙ является сокращением для всех предыдущих режимов. При использовании режима ТРАДИЦИОННЫЙ, MySQL выдает ошибку, если вы пытаетесь вставить неправильное значение в столбец. Он не корректирует значение до максимально возможного допустимого значения.

----- 2004-12-01 5.0.2 -- Добавлены или изменены функциональные возможности -- -----

Флаг компиляции DONT_USE_DEFAULT_FIELDS был удален, потому что вы можете получить такое же поведение, установив sql_mode для системной переменной STRICT_TRANS_TABLES.

----- 2004-12-01 5.0.2 -- Добавлены или изменены функциональные возможности -- -----

Теперь MySQL запоминает, какие столбцы были объявлены имеющими значения по умолчанию. В STRICT_TRANS_TABLES/STRICT_ALL_TABLES, теперь вы получите сообщение об ошибке, если выполните INSERT без указания всех столбцов, не имеющих значения по умолчанию. Побочным эффектом этого является то, что когда вы выполняете SHOW CREATE для новой таблицы, вы больше не видите значение DEFAULT для столбца, для которого вы не указали значение по умолчанию.

person Rick James    schedule 27.08.2019