Schema

Percona 和 MariaDB-10.0 忽略表欄位不為空

  • July 20, 2016

在 percona-5.6 和 MariaDB-10.0 伺服器上,表欄位上聲明的 NOT NULL 將被忽略。在插入數據時,我可以將聲明為 NOT NULL 的欄位留空,並且伺服器不會引發錯誤或停止插入。當我在 MySQL-5.6 和 MariaDB-5.5 上嘗試它時,它可以正常工作,並且不允許您在聲明為 NOT NULL 的欄位上插入空值。

請告知為什麼在 mariaDB-10.0 上會出現這種情況。謝謝

這取自 MySQL 文件:

MySQL 5.7.1 中的更改(2013-04-23,里程碑 11)

…如果一列被聲明為 NOT NULL,則不允許將 NULL 插入該列或將其更新為 NULL。但是,即使存在將列設置為非 NULL 值的 BEFORE INSERT(或 BEFORE UPDATE 觸發器),也會強制執行此約束。現在,根據 SQL 標準,在語句末尾檢查約束。(錯誤#6295,錯誤#11744964)。…

基本上要改變這種行為可以做到以下幾點:

MariaDB> SET SESSION sql_mode := 'NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
MariaDB> SELECT @@GLOBAL.sql_mode 'sql_mode::GLOBAL',
         @@SESSION.sql_mode 'sql_mode::SESSION';
+------------------------+-----------------------------------------------------------------------------------------------------------------+
| sql_mode::GLOBAL       | sql_mode::SESSION                                                                                               |
+------------------------+-----------------------------------------------------------------------------------------------------------------+
| NO_ENGINE_SUBSTITUTION | NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+------------------------+-----------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB> SHOW CREATE TABLE `table_name`;
+------------+----------------------------------------------------------------------------+
| Table      | Create Table                                                               |
+------------+----------------------------------------------------------------------------+
| table_name | CREATE TABLE `table_name` (                                                |
|            |        `id` INT(11) UNSIGNED NOT NULL,                                     |
|            |        `field` VARCHAR(20) DEFAULT NULL,                                   |
|            |        `field_with_default_value` VARCHAR(20) NOT NULL DEFAULT 'myDefault' |
|            | ) ENGINE=InnoDB DEFAULT CHARSET=latin1                                     |
+------------+----------------------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB> INSERT INTO `table_name`(`id`, `field`, `field_with_default_value`)
  VALUES
  (1, 'Value', NULL);
ERROR 1048 (23000): Column 'field_with_default_value' cannot be null

我希望這是路上的一盞燈。

引用自:https://dba.stackexchange.com/questions/89121