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

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

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

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

Q&A

解決済

3回答

585閲覧

Mysqlでのデータベースのインポートで、カラム数を減らす方法

toera

総合スコア14

MySQL

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

0グッド

0クリップ

投稿2018/03/29 03:40

容量が大きめのテーブルをsqlファイルからインポートしようとしています。
sqlファイルの中身は、

DROP TABLE IF EXISTS `テーブル名`; CREATE TABLE `テーブル名` (カラム名1 型, カラム名2 型, カラム名3 型, カラム名4 型,… ); INSERT INTO `テーブル名` VALUES (値1,値2,値3,値4,値5,…), (…),(…) ,…, (…); ```という感じです。 自分が使うカラムはカラム1、カラム2、カラム3だけなので、インポートの処理を軽くするためにも、 カラム3までのデータのテーブルを作るようにしたいです。 そこでCREATE文を ```ここに言語を入力 CREATE TABLE `テーブル名` (カラム名1 型, カラム名2 型, カラム名3 型);

に書き換えてみたのですが、INSERT部分で「コラムの数が違います」というエラーが出てしまいます。
VALUESの量がかなり多いので、全部の値を(値1,値2,値3)の形に変えていくのはとてもじゃないけど無理です。
VALUESの形はそのままで、少ないカラムのテーブルに挿入する方法はありますか?

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

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

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

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

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

guest

回答3

0

ベストアンサー

LOAD DATAなら項目のスキップが可能なので(参考:MysqlでCSVから特定列だけインポートする)、いっそのことVALUES部分をCSVとして切り出して行った方が、処理時間の軽減も見込めるかもしれません。

投稿2018/03/29 04:55

sazi

総合スコア25195

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

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

0

ALTER TABLEで削除はいかがですか?
mysql> alter table [table_name] drop [column], drop [column2], drop [column3];

これが面倒となれば
コンバートプログラムをつくって
selectで必要なカラムを読み
insertする
前の人が言っていたSQLと同じだと思いますが

投稿2018/03/29 05:19

編集2018/03/29 07:16
casaganai

総合スコア144

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

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

0

SQL

1 2INSERT INTO `テーブル名`(`カラム名1`,`カラム名2`,`カラム名3`) VALUES (値1,値2,値3),(・・・)・・・ 3

としてください

追記

上記、命題の意図と異なるようです。追加情報待ち

変換例

SQL

1create table tbl(id int,val int);

に対して

SQL

1insert into tbl values(1,100,110,120),(2,200,210,220),(3,300,310,320);

を突っ込んでエラーになるとき、こう変換するといけます

SQL

1insert into tbl select id,val from ( 2select 1 as id,100,110 as val,120 3union all select 2,200,210,220 4union all select 3,300,310,320) as dummy;

※見やすいように改行してますが、実際にはしてもしなくてもいい

  • 「values(」を「select id,val from (select 」に変換
  • 「),(」を「 union all select 」に変換
  • ケツに「 as dummy」(名前は何でもいい)を付ける;
  • 1行目の取り出したいデータに名前をつける

今回だと1列目のデータを「1」→「1 as id」、3列目のデータを「110」→「110 as val」
取り込まないデータに関しては特に名前をつけなくてもよいし
2行目以降のデータにも名前はいらない

投稿2018/03/29 04:03

編集2018/03/29 04:28
yambejp

総合スコア114843

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

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

yambejp

2018/03/29 04:06

ちょっと質問の意図と違うようですね。 テキストで与えられるのでしょうか? データの渡す方式によっては処理ができるかもしれません 逆に細かい設定ができないなら元のテーブル形式のまま入れ込んで あとからカラムを削除するほうがはやいかもしれません
退会済みユーザー

退会済みユーザー

2018/03/29 04:07

え? それが大変だからなんとかなりませんか? という質問だと思ったんですが、違うのかな?
退会済みユーザー

退会済みユーザー

2018/03/29 04:08

フォローされてたし。
yambejp

2018/03/29 04:09

ちなみに「VALUESの形はそのままで、少ないカラムのテーブルに挿入する方法はありますか」については「ありません」というのが回答になります
yambejp

2018/03/29 04:29

luckerさん、ツッコミ早すぎです(苦笑) まぁよく読まずに回答した私がいけないのですが
退会済みユーザー

退会済みユーザー

2018/03/29 04:31

わるいことしたなぁと、反省はしています。
toera

2018/03/29 05:28

回答ありがとうございます! 分かりずらい質問になってしまいました(汗) 1GBくらいのSQLファイルがあって、そのINSERT文VALUESの中に沢山のデータの値が並んでいるんです。 時間がかかってしまいそうなので良い方法はないかなと質問しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問