2017-05-11 2 views
0

"start_date"という名前の列を含むテーブルがあります。私は1つの更新クエリ内のすべての日付時刻に時間を追加したいが、それは私にエラーメッセージColumn 'start_date' cannot be nullMySQLはタイムスタンプの時刻を追加するためにすべての行を更新します。「列 'start'はnullにはできません」

を与え、私は、MySQL 5.7.17と次のクエリを使用しています:

UPDATE tbl_event SET start_date = DATE_ADD(start_date, INTERVAL 1 HOUR); 

それが正常に動作します私が1行でそれをやっているときに、私はすべてを変更したいときではありません。ここに何かがないのですか?

編集:あなたは(少なくとも1つを持っている場合

CREATE TABLE `tbl_event` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `created_by` int(11) DEFAULT NULL, 
    `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, 
    `start_date` datetime NOT NULL, 
    `end_date` datetime NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `FK_EVENT_CREATED_BY` (`created_by`), 
    CONSTRAINT `FK_EVENT_CREATED_BY` FOREIGN KEY (`created_by`) REFERENCES `tbl_user` (`id`) ON DELETE SET NULL, 
) ENGINE=InnoDB AUTO_INCREMENT=442 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 
+2

この列にnull値があるようです。 start_dateがnullのレコードをすべて選択してください。 – Jens

+0

@Jensは言っています。もしnullでないものを更新したいのであれば、 'WHERE start_date is not NULL'をクエリに追加してください。 –

+0

私の質問では、 nullにならないため、null値は含まれません。列のすべての値は有効な日付です。 –

答えて

1

は非常に奇妙な何かが起こっている場合を除き、私はあなたの問題を引き起こす可能性がある唯一の事を考える非されています。ここでは、テーブルの作成構文は次のとおりです。 NULL)の値をstart_dateに設定すると、1時間追加するとNULLが生成される可能性があります。

たとえば、有効なdatetimeの範囲で結果をプッシュできる値が存在する可能性があります。私はそれがあなたの問題を特定のMySQLバージョンで再現すると思います。

(今はコメントで明らかにされてきた、とGhostGamblerによって示唆されているように、値が古いMySQLの「ゼロの日付」だったとしてDATE_ADDからNULLを得含め、いくつかの奇妙な挙動を示す(0000-00-00 00:00:00)。)

あなたはとあなたの問題を引き起こしている値を持つ行を見つけることができます。

SELECT * FROM tbl_event WHERE DATE_ADD(start_date, INTERVAL 1 HOUR) IS NULL; 

を...そしてあなたが見つけるものに応じてデータまたはクエリを修正するために、そこから行動します。

+0

私は非null値に1時間を追加すると、出力としてnullを生成する理由を考えることはできませんが、私はあなたのためのmysqlだと思います。 – Donnie

+0

@Donnieこれは、DATE_ADD関数は、操作が本当に意味をなさない場合にはNULLを返します。これは、MySQLの「ゼロデート」という奇妙な履歴と組み合わされています。過去。最近では、MySQLの[NO_ZERO_DATE'](https($ 0000-00-00 00:00:00:00))のように、デフォルトでテーブルに0の日付://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_date)が有効になっています。だから、歴史と古いデータの奇抜さ、私は推測しています。 –

関連する問題