質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

684閲覧

mysql table追加時 Incorrect default value '0000-00-00 00:00:00' for column 'changed'

roswell

総合スコア17

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2018/12/27 06:49

php で動く http://sitebar.org/requirements.php というプログラムがあるのですが、

mysql databaseのtableに、レコードを追加するところで、

Invalid query: 1978: Incorrect default value '0000-00-00 00:00:00' for column 'changed' INSERT INTO sitebar_link (name, url, favicon, target, private, is_feed, comment, validate, added, nid) VALUES ('Google', 'https://www.google.co.jp/', '', '', 0, 0, '', 1, now() , 2)

になってしまうのです。

対応 tableは、下記になり、

yama@jpx20120007:~$ sudo mysql mysql [sudo] yama のパスワード: MariaDB [mysql]> use sitebar; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A MariaDB [sitebar]> describe sitebar_link ; +------------+------------------+------+-----+---------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+------------------+------+-----+---------------------+----------------+ | lid | int(10) unsigned | NO | PRI | NULL | auto_increment | | nid | int(10) unsigned | NO | MUL | 0 | | | url | text | NO | | NULL | | | name | varchar(255) | NO | | | | | private | tinyint(1) | YES | | 0 | | | comment | longtext | YES | | NULL | | | favicon | text | YES | | NULL | | | added | datetime | NO | | CURRENT_TIMESTAMP | | | changed | datetime | NO | | 0000-00-00 00:00:00 | | | visited | datetime | NO | | 0000-00-00 00:00:00 | | | tested | datetime | NO | | 0000-00-00 00:00:00 | | | deleted_by | int(10) unsigned | YES | | NULL | | | is_dead | tinyint(1) | NO | | 0 | | | is_feed | tinyint(1) | NO | | 0 | | | is_sidebar | tinyint(1) | NO | | 0 | | | hits | int(10) unsigned | NO | | 0 | | | validate | tinyint(1) | NO | | 1 | | | target | varchar(32) | YES | | NULL | | | type | varchar(10) | YES | | | | +------------+------------------+------+-----+---------------------+----------------+ 19 rows in set (0.00 sec)

エラーメッセージより、

| changed | datetime | NO | | 0000-00-00 00:00:00 | |

の Field 'changed' の初期値を CURRENT_TIMESTAMP に変更すれば、解消されるかもと思い...

MariaDB [sitebar]> alter table 'sitebar_link' ALTER 'changed' SET DEFAULT CURRENT_TIMESTAMP; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''sitebar_link' ALTER 'changed' SET DEFAULT CURRENT_TIMESTAMP' at line 1

となってしまいます。

何か対処方法があれば、御教示をお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/12/27 07:36

sitebar_link テーブルのCREATE文を提示いただけますか? 再現確認と調整を行いたいです。
roswell

2018/12/27 07:57

mts10806さん、サポートありがとうございます。 事情が複雑なのですが、 旧サーバマシン、sitebar (ver. 3.3.9)で、 sitebar自身が作成した、sitebar_link テーブルは、 ソースより、下記になります。 CREATE TABLE `sitebar_link` ( `lid` int(10) unsigned NOT NULL auto_increment, `nid` int(10) unsigned NOT NULL default '0', `url` text NOT NULL, `name` varchar(255) NOT NULL default '', `private` tinyint(1) default '0', `comment` longtext, `favicon` text, `added` datetime NOT NULL default '0000-00-00 00:00:00', `changed` datetime NOT NULL default '0000-00-00 00:00:00', `visited` datetime NOT NULL default '0000-00-00 00:00:00', `tested` datetime NOT NULL default '0000-00-00 00:00:00', `deleted_by` int(10) unsigned default NULL, `is_dead` tinyint(1) NOT NULL default '0', `is_feed` tinyint(1) NOT NULL default '0', `is_sidebar` tinyint(1) NOT NULL default '0', `hits` int(10) unsigned NOT NULL default '0', `validate` tinyint(1) NOT NULL default '1', `target` varchar(32), `type` varchar(10) DEFAULT '', PRIMARY KEY (`lid`), UNIQUE KEY `name` (`nid`,`name`) ) 今回、 新サーバマシンで、sitebar (ver. 3.4)に更新し 「旧データベース」を、そのまま、importしています。 ちなみに、sitebar (ver. 3.4)の、sitebar_link テーブルは、 create文は、ソースより、下記になります。 CREATE TABLE `sitebar_link` ( `lid` int(10) unsigned NOT NULL auto_increment, `nid` int(10) unsigned NOT NULL default '0', `url` text NOT NULL, `name` varchar(255) NOT NULL default '', `private` tinyint(1) default '0', `comment` longtext, `favicon` text, `added` datetime NOT NULL default CURRENT_TIMESTAMP, `changed` datetime, `visited` datetime, `tested` datetime, `deleted_by` int(10) unsigned default NULL, `is_dead` tinyint(1) NOT NULL default '0', `is_feed` tinyint(1) NOT NULL default '0', `is_sidebar` tinyint(1) NOT NULL default '0', `hits` int(10) unsigned NOT NULL default '0', `validate` tinyint(1) NOT NULL default '1', `target` varchar(32), `type` varchar(10) DEFAULT '', PRIMARY KEY (`lid`), UNIQUE KEY `name` (`nid`,`name`) )
m.ts10806

2018/12/27 07:58

質問は編集できるので追記いただければと。 ただ、別でコメントしましたが、SyntaxはMySQLの仕様っぽいですね。
sazi

2018/12/27 08:35

一寸分からなくなってきました。そもそも、 Invalid query: 1978: Incorrect default value '0000-00-00 00:00:00' for column 'changed' のエラーは、sitebar (ver. 3.4)に対して行った結果ですか?
roswell

2018/12/27 09:14

sazi さん、 >Invalid query: 1978: Incorrect default value '0000-00-00 00:00:00' for column 'changed' >のエラーは、sitebar (ver. 3.4)に対して行った結果ですか? 旧サーバーマシン sitebar (ver. 3.3.9) mysql database: sitebar 新サーバーマシン sitebar (ver. 3.4) mysql database: 旧サーバーマシンのdatabase sitebarを sudo mysql -u root -p sitebar < sitebar.sql でインポート 新サーバーマシンの、sitebarへアクセスし、url追加すると、 Incorrect default value '0000-00-00 00:00:00' for column 'changed' が表示され、追加できない。 です。
sazi

2018/12/27 09:26 編集

sitebar (ver. 3.4)のcreate文は適用していないという事ですね。
roswell

2018/12/27 09:27

sazi さん、 > sitebar (ver. 3.4)のcreate文は適用していないという事ですね。 はい、そうです。 sitebar 3.4 になって、table sitebar_link (ver. 3.3.9で使用していた)に、 url を新規に追加する際、tableのNullとDefaultの扱い方が、微妙に 異なり、さらに、mysql の version の差もあり、状況が複雑になっている ようです。 sitebar ver. 3.3.9の 過去のデータを利用したかったので、こんな事になってしまいました。
guest

回答2

0

ベストアンサー

2つ目の構文エラー
' (シングルクォート)じゃなくて ` (バッククォート)に修正すれば効くかと。
シングルクォートだと単なる文字列として解釈させることになります。
(テーブル名やカラム名はクォートなしでも通りますけどね)

追記

対応方法としては幾つか。
0. 日付関係で「Null->No」となっているカラムには初期値をユニックスタイム以降で挿入する。面倒ならNOW()で良い
0. 何も値入れないなら「Null->Yes」に変更する
0. SQLモードを変更という手もある

投稿2018/12/27 07:11

編集2018/12/27 07:42
m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

roswell

2018/12/27 08:21

mts10806 さん 1. はちょっと、sql文が分からなかったので、スキップ。 2. MariaDB [sitebar]> ALTER TABLE sitebar_link MODIFY COLUMN changed NOT NULL; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'NOT NULL' at line 1 3. 実は、これもいろいろ試していて /etc/mysql/my.cnf に以下を追加 [mysqld] sql_mode='' で、再起動させたりしたのですが、エラーは消えずで、結局エラーメッセージより、 sitebar_link テーブルが良くないとの結論に至りました。
m.ts10806

2018/12/27 08:32 編集

1. え。最初のINSERT文でaddedカラムに対してnow()を設定してるじゃないですか・・・。 NULLがNOになっているカラムに対してinsert文でnow()を指定していけばいいだけですよ。 2.よく分からない文になっていますがNot NullになっているからNullにしましょうという提案です。 ALTER TABLE sitebar_link CHANGE changed changed TIMESTAMP NULL ; のような形になると思います。 なお、NOT NULLなら初期値設定が必要です。 3. 私の環境で試せないので割愛。
roswell

2018/12/27 08:40

mts10806 さん、ご教示ありがとうございます。 2. の方法で、 フィールドのchangedを変更後、再度、sitebar で url を登録し、 エラーが出た field を 同じように、対応したら、正常に動作するようになりました。 ありがとうございました。 MariaDB [sitebar]> ALTER TABLE sitebar_link CHANGE changed changed TIMESTAMP NULL ; Query OK, 465 rows affected (0.14 sec) Records: 465 Duplicates: 0 Warnings: 0 MariaDB [sitebar]> ALTER TABLE sitebar_link CHANGE visited visited TIMESTAMP NULL ; Query OK, 465 rows affected (0.08 sec) Records: 465 Duplicates: 0 Warnings: 0 MariaDB [sitebar]> ALTER TABLE sitebar_link CHANGE tested tested TIMESTAMP NULL ; Query OK, 465 rows affected (0.09 sec) Records: 465 Duplicates: 0 Warnings: 0
m.ts10806

2018/12/27 08:47

私の方はPhpMyAdminから吐き出したコードなのですがもしかしたら「このカラムをこのように変える」の「このように変える」はカラム名も含めて全部入れないといけないのかもしれませんね。 最初の文もそれで試してもらえますか?
roswell

2018/12/27 09:20

mts10806 さん > 最初の文もそれで試してもらえますか? >日付関係で「Null->No」となっているカラムには初期値をユニックスタイム以降で挿入する。面倒ならNOW()で良い これ、2 で、Null->YESにしたのを、一旦、NOに戻してということですよね。?
m.ts10806

2018/12/27 10:44

あれ?解決になってますね。 もう少しいろいろ検証しようと思ってたんですが(たぶん明日になりますけど) ↑についてはちょっとごちゃ混ぜになってますね。now入れるのは別にnullであろうとなかろうと関係はないですね。 「最初の」はあくまでCURRENT TIMESTAMPを設定しようとしていたときのALTER文の話です。今回のCHANGの書き方がSyntax回避の書き方につながるかもしれないと。 まあ、本件の解決とはずれていくので、本件解決したなら言及の必要はなさそうですね。
roswell

2018/12/27 10:56

>あれ?解決になってますね。 問題は解決したので、一旦、解決済みにしました。 >本件の解決とはずれていくので、本件解決したなら言及の必要はなさそうですね。 ひとまず、ご教示ありがとうございました。 他の動作問題がでてきました。一難さってまた一難です。
m.ts10806

2018/12/27 10:59

了解です。 私が回答の後半に書いた3つの案はあくまで現状回避のためのものなので、それが仕様に沿うかと言うと別問題ですしね。
guest

0

'がエラーだと思われます。

SQL

1alter table sitebar_link ALTER changed SET DEFAULT CURRENT_TIMESTAMP;

または

SQL

1alter table `sitebar_link` ALTER `changed` SET DEFAULT CURRENT_TIMESTAMP;

追記

デフォルト値の設定

1つのテーブル内でデフォルト値としてCURRENT_TIMESTAMP関数が設定できるTIMESTAMP型のカラムは1つだけです。その為、2つ目以降のTIMESTAMP型のカラムにデフォルト値としてCURRENT_TIMESTAMP関数を設定するとエラーが発生します。

試せてないのですが、上記が制限としてあるなら、changed,visited,testedのdefault設定を無しにするか、単なる0を指定するか、insertで値を指定(current_timestampなど)する必要があります。

若しくは、一つまでなら、on update current_timestampを付加する。
MySQL5.6で作成日時と更新日時を自動で設定してみる

投稿2018/12/27 07:08

編集2018/12/27 08:20
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

roswell

2018/12/27 07:16

sazi さん、サポートありがとうございます。 ご教示いただいた、sql文 両方試してみたのですが、共に error になってしまいます。 MariaDB [sitebar]> alter table sitebar_link ALTER changed SET DEFAULT CURRENT_TIMESTAMP; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'CURRENT_TIMESTAMP' at line 1 MariaDB [sitebar]> alter table `sitebar_link` ALTER `changed` SET DEFAULT CURRENT_TIMESTAMP; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'CURRENT_TIMESTAMP' at line 1
sazi

2018/12/27 07:32

>mst10806 さん 提示のURLに、「1つのテーブル内でデフォルト値としてCURRENT_TIMESTAMP関数が設定できるTIMESTAMP型のカラムは1つだけです。」ってありますね。
roswell

2018/12/27 07:34

sazi さん、 >MariaDBのバージョンが1.0および1.1だとDEFALTでのCURRENT_TIMESTAMPの使用はサポートされない様なのですが、addedには設定されているのですよね? added には設定されているかどのように確認すればよろしいですか? mysql や まして、MariaDB そのものや設定について詳しくないので、ご教示いただけますか?
m.ts10806

2018/12/27 07:37 編集

saziさん あ、そこですね。確かに複数設置できたら意味がなくなりますね。
m.ts10806

2018/12/27 07:37 編集

ついでの横槍すみません。 >roswellさん ご自身でテーブル構成出されてますよね。そこにちゃんと↓ | added | datetime | NO | | CURRENT_TIMESTAMP | |
sazi

2018/12/27 07:37

> rowswell さん 「describe sitebar_link」で設定されている内容は確認できています。 で、何でだろう?という事なのですが複数設定できないという事なのかもしれません
roswell

2018/12/27 07:38

>「1つのテーブル内でデフォルト値としてCURRENT_TIMESTAMP関数が設定できるTIMESTAMP型のカラムは1つだけです。」ってありますね。 は、既に、テーブル内に added | datetime | NO | | CURRENT_TIMESTAMP added というフィールドが、Default 値として、CURRENT_TIMESTAMP となっているので、 他のフィールドは、Default値として持てないということ解釈であっていますでしょうか?
sazi

2018/12/27 07:40

そうなんですけど、syntaxエラーっていうのが気になります。 syntaxエラーが無くなると、リンク先のエラーになるのかもしれませんが
m.ts10806

2018/12/27 07:53 編集

ミニマム構成で試してみたんですが、syntaxエラーになりますね。 MySQLの仕様なのかもしれません。あくまでdefaultは文字列とか数値とか具体的な値で使えと。 DEFAULT '0000/00/00'とかDATE形式で使える形なら通りました。
m.ts10806

2018/12/27 07:56

↑ちなみにCURRENT_TIMESTAMPのカラムをなしにしても同じ結果でした。
sazi

2018/12/27 07:59

>mts10806 さん お願い事で恐縮ですが、on update current_timestamp付けると3つでも可能でしょうか?
m.ts10806

2018/12/27 08:01

saziさん どんな感じのAlterになりますか?例示してもらえると助かります。
sazi

2018/12/27 08:10

alter table sitebar_link ALTER changed SET DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
m.ts10806

2018/12/27 08:13

ありがとうございます。 同じくSyntaxですね。
sazi

2018/12/27 08:15

DEFAULT CURRENT_TIMESTAMPの場合、on 付きも一つまでって事ですね。
m.ts10806

2018/12/27 08:18

エラー表示としては不親切ですね。 パースエラー(#1064)ですし。
sazi

2018/12/27 08:29 編集

defaultでのcurrent_timestampの指定に個数制限があるって云うのが不思議でした。 他のDBMSでは見た事ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問