MySQL升级后为什么不能在列中插入NULL值?

时间:2016-04-26 16:21:38

标签: php mysql

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

  

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

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

  

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;

3 个答案:

答案 0 :(得分:6)

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

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

sql-mode=""

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

SET GLOBAL sql_mode = '';

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

答案 1 :(得分:2)

  

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

那不是真的:

NULL

如果列实际上是可选的,请更改表并使其for (int i = 0;i<Lesson.length;i++) if(Lesson[i].getBeginDate() == beginDate || Lesson[i].getEndDate() == endDate){ return false; //means there's a class in this date/time } else return true; // there's no class in this time. do something.. 能够。

答案 2 :(得分:-4)

尝试在引号之间插入一个空格,如下所示:

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