4年に一度のスポーツの祭典 全競技速報中

以下は著書の要旨です。
-----------------------------
テーブルのカラム構造だけをコピーする
それで、
 できること
 1) 生身のデータはコピーされない
 2) 「AUTO_INCREMENT」や「PRIMARYKEY」などのレコードの属性がコピーされる。
 
 ◎テーブルカラム構造だけコピーして新しくテーブルを作成
  [CREATE TABLE]でテーブル名の後に[LIKE]を付け、コピー元となテーブルを指定します。
 
 書式:テーブルカラム構造だけレコーして新たらしくターブルを作成
 +------------------------------------------------------------+
 | CREATE TABLE 新規テーブル名 LIKE 元となるテーブ-ル名; |
 +------------------------------------------------------------+
では、社員情報テーブル[tb1]と同じカラム構造を持つ、空テーブル
[tb_bkc]を作りさらに、テーブル[tb1]と[tb1_bkc]のカラム構造を表示してみます。

操作手順
 ①次を実行する
 +----------------------------------+
 | CREATE TABLE tb1_bkc LIKE tb1; |
 +----------------------------------+
 
  ②次を実行する
 +----------------------------------+
 | DESC tb1; |
| DESC tb1_bkc; |
 +----------------------------------+

実行結果
-----------------------------
mysql> SELECT * FROM tb1_bk;
+------+------+------+
| bang | nama | tosi |
+------+------+------+
| a101 | 佐藤 | 40 |
| a102 | 高橋 | 28 |
| a103 | 中川 | 20 |
| a104 | 渡辺 | 23 |
| A105 | 西沢 | 35 |
+------+------+------+
11 rows in set (0.01 sec)
--------------------------------------
以上ですが!
できること
 1) 生身のデータはコピーされない
とあります。しかし
佐藤、高橋など中身のデータまでコピーされるのはなぜですか?
よろしくお願いいたします。

質問者からの補足コメント

  • うーん・・・

    文字オーバーでしたので補足で発信します。
    どうもすみません!ミスっていました!

    mysql> SELECT * FROM tb1_bk;は間違いでは元データのことで
    mysql> select * from tb1_bkc;が正解でした。
    しかし結果は同じで、構造だけ継承されるべきところですが
    データも入っていますのでいわゆる全部コピーされている状態です。
    ちなみに全部大文字の
    SELECT * FROM TB1_BKC;
    変えて試しましたが結果は同じでした。

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/04/13 14:54
  • うーん・・・

    以下実行結果です。
    mysql> SELECT * FROM tb1_bkc;
    +------+------+------+
    | bang | nama | tosi |
    +------+------+------+
    | a101 | 佐藤 | 40 |
    | a102 | 高橋 | 28 |
    | a103 | 中川 | 20 |
    | a104 | 渡辺 | 23 |
    | A105 | 西沢 | 35 |
    +------+------+------+
    22 rows in set (0.00 sec)

    バグでしょうか!?

      補足日時:2021/04/13 14:56
gooドクター

A 回答 (2件)

>>バグでしょうか!?



そんな感じですね。でも、MySQLの5.7系列の最新版は、5.7.33みたいですので、こちらにすると直っているかも?

現在、MySQLのライセンスはOracle社にあります。以前はSun Microsystemsにあったのですが、Sunが買収されてしまいましたからね。
一時期、OracleはSunから引き継いだ技術にかなりの投資をしていたと思いますが、なんかそのあたりのモノはリストラされたような気がします。
そして商売上は、Oracleとしては、MySQLじゃあなくて、有償のOracleデータベースを売りたいはずだと思われます。
となれば、MySQLへの力の入れ方が下がるのも仕方ないかな?なんて思ったりしています。
なお、MySQLは5.7から6,7を飛ばしてバージョンが8のものもあるようです。が、5.7との仕様の差が大きいので、移行は大変かもしれません。
    • good
    • 1
この回答へのお礼

どうもすみません!
テーブル名:tb1_bkcですが!恥ずかしながら、以下の処理後
、少なくてもP106~107処理を行ってから
SELECT * FROM tb1_bkc;
を行った可能性があります。
 以後気を付けます。
めげずに頑張ります、今後ともよろしくお願いいたします。

P106~107
--------------------------------------
|他のテーブルのレコードをコピーする|
--------------------------------------
 目的
 1) 他のテーブルのレコード(データ)のみをコピーする。
 
 
 ◎他のテーブルのデータををコピーする
 1) コピーすできる条件:同じカラム構造であること!
2) TBのデータを丸ごとコピーする構文は[SELECT]したデータを[INSERT]する
   という流れです。

お礼日時:2021/04/14 08:04

以下の処理を試してみました。



OS: Windows10
DB: Maria DB 10.5 (MySQLの互換DB)
ツール: A5:SQL mk2 version 2.15.5 64bit

1)新規のテーブル address を作って、2件のデータを追加。
2)CREATE TABLE newaddress LIKE address; を実行。
3)テーブル newaddress は作成された。データは0件。

想定されるとおりに、構造はコピーされて、中身のデータはコピーされませんでした。
一番ありえそうなのは、質問者さんの操作手順に間違いがある。
もし手順に間違いが無いのであれば、使われたMySQLのバグってことかもしれませんね。

ちなみに、MySQLの互換であるMariaDBを使っている理由は、Windows上でテーブル名に小文字が使えないからです。
MySQL互換のMariaDBでは、設定ファイルの変更で、テーブル名に小文字が使えます。
小文字が使えると、SQLServer等、小文字のテーブル名があるデータベースをMySQLに移行しやすいからです。

ちなみに、Linux(CentOS7)上でも、MySQLではなく、MariaDBを使っています。
DBの処理スピードはMariaDBのほうが速いようです。
この回答への補足あり
    • good
    • 2
この回答へのお礼

おはようございます。
お待たせしました。
どうもすみません 
誤字訂正です。生身を中身に変更します。
 
私は現在「基礎からのMySQL 第3版」
でMysqlを学んでいます。
https://play.google.com/store/books/details/%E8% …
この場合 MySQLの環境は以下です。

1) OS:Windows10 です。
2) MAMP 3.31
3) mysql> select version();
+------------+
| version() |
+------------+
| 5.6.34-log |
+------------+
以上ですが何かありましたらご連絡をお待ちしています。
 
操作手順ですが、このサイトでは文字オーバーと図形が崩れましたので
私のレンタルサーバの以下のURLからご確認が取れます。
http://afurieitohannei.la.coocan.jp/sns/teburuco …

何かありましたら、ご連絡いただけましたら光栄です。

よろしくお願いいたします。

お礼日時:2021/04/13 07:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング