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

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

ただいまの
回答率

87.49%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,603

score 13

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

となってしまいます。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • roswell

    2018/12/27 18: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 18:18 編集

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

    キャンセル

  • roswell

    2018/12/27 18: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の 過去のデータを利用したかったので、こんな事になってしまいました。

    キャンセル

回答 2

checkベストアンサー

+1

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

追記

対応方法としては幾つか。

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/27 19:44

    あれ?解決になってますね。
    もう少しいろいろ検証しようと思ってたんですが(たぶん明日になりますけど)

    ↑についてはちょっとごちゃ混ぜになってますね。now入れるのは別にnullであろうとなかろうと関係はないですね。
    「最初の」はあくまでCURRENT TIMESTAMPを設定しようとしていたときのALTER文の話です。今回のCHANGの書き方がSyntax回避の書き方につながるかもしれないと。

    まあ、本件の解決とはずれていくので、本件解決したなら言及の必要はなさそうですね。

    キャンセル

  • 2018/12/27 19:56

    >あれ?解決になってますね。

    問題は解決したので、一旦、解決済みにしました。

    >本件の解決とはずれていくので、本件解決したなら言及の必要はなさそうですね。

    ひとまず、ご教示ありがとうございました。
    他の動作問題がでてきました。一難さってまた一難です。

    キャンセル

  • 2018/12/27 19:59

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

    キャンセル

+1

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

alter table sitebar_link ALTER changed SET DEFAULT CURRENT_TIMESTAMP;


または

alter 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 17:15

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

    キャンセル

  • 2018/12/27 17:18

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

    キャンセル

  • 2018/12/27 17:27 編集

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

    キャンセル

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る