2016-04-26 69 views
1

升级我的MySQL后,我有数据库的问题。在日志中我可以看到:为什么MySQL升级后无法将NULL值插入列中?

PHP Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'kod_tecdoc' cannot be null in.

当我尝试插入或更新表中的行。 我很惊讶becouse升级之前工作良好。我的表格字段允许清空值。我知道解决方案可能是

if ($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; 
+1

SO向我们展示了该表的架构 – RiggsFolly

+1

空值不为空。将该字段更改为可空。 – frz3993

+0

我正在使用本地数据库,它是服务器上的基本副本。在服务器上运行良好。我很好奇升级后发生了什么。我的项目中有130张桌子。改变所有的场地将会很长。 – Tomasz

回答

4

你的本地MySQL服务器在“严格”的模式,这将引发错误的情况下,像你这样的,跑步和其他几个人是否则处理“优雅”没有严格的模式。从MySQL 5.7.5开始,默认的SQL模式包括STRICT_TRANS_TABLES,这正是您头痛的原因。

要更改本地服务器的方式,编辑您的my.cnf(或my.ini文件,如果你运行的是Windows)和模式设置为:

sql-mode=""

或者,在连接到MySQL中您的Web应用程序,首先执行该查询的连接estabilished之后:

SET GLOBAL sql_mode = '';

我反对这项建议,因为它可以让你执行一个位粗心的语句。从长远来看,你最好用adjusting your schema instead

+0

+1为什么我的优秀答案,我建议编辑参考[@Alvaro的回答]( HTTP://计算器。com/questions/36870530/mysql-can not-insert-null-value-in-column#36870917) –

+0

它确实有帮助!谢谢。我把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';但在这种情况下不起作用。 – Tomasz

+0

我很高兴我帮助:)我接受了你的编辑@JeffPuckettII,谢谢! –

2

My table fields allows to empty values.

这不是真的:

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

如果列真的是可选的,更改表,使其NULL能够。

+0

关键是我没有更改表结构,并且在将mysql升级到5.7.12之前它工作正常,并且在该数据库的服务器副本上工作正常。我很好奇发生了什么,区别在哪里?这个问题出现在许多领域和许多表格中。 – Tomasz

+0

您的旧引擎正在输入值'''',请参阅[@ drndavi的答案](http://stackoverflow.com/questions/36870530/mysql-cannot-insert-null-value-in-column#36871020) –

+0

您可能已经改变了默认的SQL_MODE变量。 –

-3

尝试插入空格引号之间,这样的:

if ($kod_tecdoc == null) $kod_tecdoc = ' '; 
+0

'NULL'与''''不一样,这会给你后面的各种查询带来不同的结果,特别是关于聚合函数 –

相关问题