【问题标题】:Why can't I insert NULL value into column after MySQL upgrade?MySQL 升级后为什么不能在列中插入 NULL 值?
【发布时间】:2016-04-26 16:21:37
【问题描述】:

升级我的 mysql 后,我的数据库出现问题。在日志中我可以看到:

PHP 致命错误:未捕获的 PDOException:SQLSTATE[23000]:违反完整性约束:1048 列 'kod_tecdoc' 不能为空。

当我尝试在表中插入或更新行时。 我很惊讶,因为在升级之前效果很好。我的表格字段允许空值。我知道解决方案可能是

如果 ($kod_tecdoc == null) $kod_tecdoc = '';

但它不能解决问题。也许应该在 mysql 中更改一些设置?
我的mysql版本:

+-----------------+
| @@version       |
+-----------------+
| 5.7.12-0ubuntu1 |
+-----------------+

表结构

 CREATE TABLE `Realizacje` (
      `id` int(11) NOT NULL,
      `tekst_allegro` text NOT NULL,
      `typy_felg` int(11) NOT NULL,
      `nazwa` varchar(200) DEFAULT NULL,
      `nazwa_allegro` varchar(255) NOT NULL,
      `producent` int(11) NOT NULL DEFAULT '0',
      `cena_netto_gielda` decimal(12,2) NOT NULL,
      `cena_brutto_gielda` decimal(12,2) NOT NULL,
      `cena_netto_hurt` decimal(12,2) NOT NULL,
      `cena_brutto_hurt` decimal(12,2) NOT NULL,
      `cena_netto_warsztat` decimal(12,2) NOT NULL,
      `cena_brutto_warsztat` decimal(12,2) NOT NULL,
      `vat` int(11) NOT NULL,
      `kod_produkt` varchar(255) NOT NULL,
      `on_pojazdy` varchar(1) NOT NULL DEFAULT '0',
      `on_zamienniki` varchar(1) NOT NULL DEFAULT '0',
      `on_kategoria` varchar(1) NOT NULL DEFAULT '0',
      `kod` varchar(255) NOT NULL,
      `kod_dostawcy` varchar(50) NOT NULL,
      `kod_tecdoc` varchar(50) NOT NULL,
      `widoczny` varchar(2) NOT NULL DEFAULT '1',
      `dostepny` varchar(2) NOT NULL DEFAULT '1',
      `dostepnosc` int(11) NOT NULL,
      `promocja` varchar(2) NOT NULL DEFAULT '0',
      `promocja_glowna` tinyint(1) NOT NULL DEFAULT '0',
      `nowosc` varchar(2) NOT NULL DEFAULT '0',
      `nowosc_glowna` tinyint(1) NOT NULL DEFAULT '1',
      `glowna` varchar(1) NOT NULL,
      `bestseller` varchar(1) DEFAULT '0',
      `bestseller_glowna` tinyint(1) NOT NULL DEFAULT '0',
      `polecamy` varchar(1) NOT NULL DEFAULT '0',
      `polecamy_glowna` varchar(1) NOT NULL DEFAULT '0',
      `skrot` text NOT NULL,
      `tekst` text,
      `odwiedziny` bigint(20) DEFAULT '0',
      `lang` varchar(5) NOT NULL DEFAULT 'pl',
      `status` int(11) DEFAULT '0',
      `link` varchar(255) DEFAULT NULL,
      `route_id` int(11) DEFAULT NULL,
      `miary` int(11) NOT NULL,
      `rabat` decimal(12,2) NOT NULL,
      `narzut` varchar(1) DEFAULT '0',
      `aukcje` varchar(255) NOT NULL,
      `stan` decimal(12,2) NOT NULL DEFAULT '1.00',
      `aktualizowany` varchar(1) NOT NULL DEFAULT '1',
      `dostawanatelefon` varchar(1) NOT NULL,
      `dodano` varchar(50) DEFAULT NULL,
      `aktualizacja` varchar(50) DEFAULT NULL,
      `kosztyAllegro` text NOT NULL,
      `allegroCennik` int(11) NOT NULL,
      `trybCena` varchar(255) NOT NULL,
      `allegro_ok` varchar(1) NOT NULL DEFAULT '0',
      `ogranicz_ilosc_znakow` int(11) NOT NULL DEFAULT '50'
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

【问题讨论】:

  • 向我们展示该表的架构
  • 空值不为空。将字段更改为可为空。
  • 我正在开发本地数据库,它是服务器上的基础副本。在服务器上运行良好。我很好奇升级后发生了什么。我的项目中有 130 个表。改变所有的孩子会很长。

标签: php mysql


【解决方案1】:

您的本地 MySQL 服务器正在“严格”模式下运行,如果像您这样的情况以及其他几个在没有严格模式的情况下“优雅”处理的情况下会引发错误。从 MySQL 5.7.5 开始,默认的 SQL 模式包括STRICT_TRANS_TABLES,这正是你头疼的原因。

要更改本地服务器的模式,请编辑您的 my.cnf(或 my.ini,如果您运行的是 Windows),然后将模式设置为:

sql-mode=""

或者,在您的网络应用程序中连接到 MySQL 后,在连接建立后立即执行此查询:

SET GLOBAL sql_mode = '';

我建议不要这样做,因为它会让你执行一些粗心的语句。从长远来看,您最好使用adjusting your schema instead

【讨论】:

  • +1 很好的回答为什么,我建议编辑参考@Alvaro's answer
  • 真的很有帮助!谢谢。我把 sql_mode = '' 放到 mysql.cnf 中,现在可以工作了。以前我尝试用 sql_mode=only_full_group_by 解决问题,我找到了解决方案: set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';但在这种情况下不起作用。
  • 很高兴我提供了帮助 :) 我接受了您的编辑@JeffPuckettII,谢谢!
【解决方案2】:

我的表格字段允许为空值。

这不是真的:

`kod_tecdoc` varchar(50) NOT NULL,
                         ^^^^^^^^

如果该列确实是可选的,请更改表格并将其设为NULLable。

【讨论】:

  • 关键是我没有改变表结构,在将mysql升级到5.7.12之前它工作得很好,并且在这个数据库的服务器副本上也工作得很好。我很好奇发生了什么,区别在哪里?问题出现在许多字段和许多表中。
  • 您的旧引擎正在估算值 '',请参阅 @drndavi's answer
  • 您可能已经更改了默认 SQL_MODE 变量。
猜你喜欢
  • 2018-05-29
  • 2016-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多