2016-04-26 13 views
1

アップグレード後、私のmysqlデータベースに問題があります。ログには次の情報が表示されます。MySQLのアップグレード後にカラムにNULL値を挿入できないのはなぜですか?

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

テーブルに行を挿入または更新しようとしました。 アップグレードがうまくいく前に私は驚いています。私のテーブルフィールドは、値を空にすることができます。私は解決策があるかもしれないことを知っています

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

このテーブルのスキーマを表示 – RiggsFolly

+1

空の値がnullではありません。フィールドをNULL可能に変更します。 – frz3993

+0

私はサーバ上のベースのコピーであるローカルデータベースに取り組んでいます。サーバー上で良い作品。私はアップグレード後に何が起こったのか不思議です。私は私のプロジェクトに130テーブルあります。すべてのファイルを変更すると非常に長くなります。 – Tomasz

答えて

4

あなたのローカルのMySQLサーバはそのあなたのような場合にエラーがスローされます「厳格な」モードで実行されている、といくつかの他れますそれ以外の場合は厳密なモードなしで「優雅に」扱われます。 MySQL 5.7.5以降、デフォルトのSQLモードにはSTRICT_TRANS_TABLESが含まれています。これはまさに頭痛の原因です。でMySQLへの接続時に、

sql-mode=""

または:

はあなたのmy.cnfを編集し、ローカルサーバーのモードを変更(またはWindowsを実行している場合のmy.ini)とにモードを設定するにはウェブアプリ、接続後にこのクエリ最初の権利を実行にestabilishedさ:

SET GLOBAL sql_mode = '';

それはあなたが少し不注意な文を実行することができますので、私はこれに対して助言するだろう。長期的には、あなたはadjusting your schema insteadでより良いです。

+0

+1の優れた答え、なぜ[@ Alvaro's answer] http:// stackoverflow。com/questions/36870530/mysql-not-insert-null-value-in-column#36870917) –

+0

本当に助かります!ありがとう。私はsql_mode = ''をmysql.cnfに入れて、現在は動作します。以前はsql_mode = only_full_group_byの問題を解決しましたが、解決策が見つかりました:グローバル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

ポイントは、私はテーブルの構造を変更していないし、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 'は'' ''と同じではありません。これは、特に集計関数に関して、後でさまざまなクエリで異なる結果を与えるでしょう。 –

関連する問題