(2023年5月)
データベースにテーブルを作成し、それを別名でコピーしたいことがある。
phpMyAdminにはその機能があり、テーブルを表示した状態で、「操作」>「テーブルを(データベース).(テーブル)にコピーする」に進み、コピー先のデータベースを選択し、テーブル名を付けて「実行」すればよい。
この時、「構造のみ」と「構造とデータ」が選べるので、構造(器)だけ、他にコピーすることも可能だ。
テーブルをデータベース内に残したまま、別名として保存することで、バックアップ用途として使う場合も多いだろう。
エラー(#1064)発生
だが、このコピーでエラーとなり、コピーできない事案がある。
黄色いエラー画面が出現し、エラーコード「#1064」を吐いている。
黄色い画面の「編集」をクリックし、SQL文を見ると、「CREATE TABLE」が記されているが、その中に、以下のような箇所があった。
`(カラム名)` datetime NOT NULL DEFAULTcurrent_timestamp()
このカラムは、INSERTされた日時(datetime)を格納するもので、デフォルト値に「current_timestamp」を指定してあるのだが、
よく見ると、「DEFAULTcurrent_timestamp()」と、「DEFAULT」と「current」の間にスペースがない。
間に半角スペースを入れて実行すると、コピーは成功した。
これ、phpMyAdminのヴァグだよね?
ネットで調べると、同様の事案で難儀(ナウなヤング語)してる人がいた。
関連:テーブルを (データベース).(テーブル)にコピーする で失敗する
phpMyAdminのバージョン
このヴァグが発生するかどうか、周辺にあるphpMyAdminのバージョンを調べてみた。
・v4.9.5:発生しない
・v4.4.15.10:発生する
・v4.0.10.18:発生しない
てコトで、途中で発生したバグなんだろう。
# 最新のphpMyAdminは v4.9.11 と v5.2.1 である。
なお、上記バグのあるv4.4.15.10に於いて、デフォルト値にcurrent_timestampが設定されたカラムを含むテーブルに対し、phpMyAdminの「挿入」からデータを追加すると、current_timestampが発動せず、「0000-00-00 00:00:00」が格納されてしまうというバグもある。
プログラムからINSERTする場合は問題ないが、phpMyAdminで挿入する際に問題となる。
この場合、日時(Y-m-d H:i:s等)を手入力するか、出現するカレンダーで選択しなければならない。
数件ならアレやけど、多数なら悲惨ヤデ、コルェは…
関連:phpMyAdminでレコード数(行数)が一致しない謎
関連:[MySQL] テーブルのエクスポートで、レコード数の不一致が生じる問題 [phpMyAdmin,Dump all rows]
関連:[phpMyAdmin] テーマ(スタイル/デザイン)の変更 [Debian]
関連:[2048KiB] phpMyAdminでのインポートファイルの上限を変更 [Debian,Ubuntu]