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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

2回答

1653閲覧

MySQLで大量のカラムを登録する際の対応

tomato01

総合スコア80

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2020/04/15 08:31

MySQLにてテーブルと約400個程度カラムを作成することを考えており、テーブルとカラムの作成を試みましたが下記のエラーが出た為、テーブルを複数に分割することで考えております。

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
(ROW_FORMAT=DYNAMICなども試しましたが改善しませんでした。)

テーブルを複数に分けるに関して質問があります。

1、テーブルを3つに分けカラムの登録が完了した後、この3つのテーブルが実際は1つのものとリレーションをつけるにはどのような方法で行えばいいでしょうか

2、実際にデータの挿入をする際は、どのような操作が必要でしょうか。(1データに400個程度の項目があります。)

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

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

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

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

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

guest

回答2

0

ベストアンサー

(´-`).。oO(400のカラムってどんな用途なんだろう…)

普通に行にした方が良くないですか?全部違うドメインなんだろうか?
あとはRDBじゃなくてNoSQL使うとか。

さておき、

1、テーブルを3つに分けカラムの登録が完了した後、この3つのテーブルが実際は1つのものとリレーションをつけるにはどのような方法で行えばいいでしょうか

各テーブルが外部キーで1:1関係の参照持っておけばいいだけだと思います。
双方向なのか片方向なのかは用途次第だけど。

2、実際にデータの挿入をする際は、どのような操作が必要でしょうか。(1データに400個程度の項目があります。)

普通に考えればINSERT文投げるわけですが。
どういう趣旨の質問なんでしょう?

行が多い場合はバルクインサートするとか、CSVみたいに他に何かデータソースがあるんだったら、インポートする方法もあるでしょう。

MySQL 複数データのバルクINSERTやCSVファイルから高速インポートする方法


追記
何やらCSVから取り込むようなので、プログラムでどう扱いたいか次第にはなるけど、そのCSVの1行をそのまま1つのカラムに格納しちゃって、プログラム側でゴニョゴニョするって手も無きにしもあらず。別にお勧めはしませんが。

1件のデータが400も属性を持つ場合、今後も更に拡張していくんじゃないかと思われますので、そうなるとキッチリしたスキーマを定義して管理していくのはすげー難しそうですね。
それが必須要件ならやらざるを得ないでしょうけど…。

投稿2020/04/15 08:40

編集2020/04/15 08:50
gentaro

総合スコア8949

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

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

tomato01

2020/04/15 08:56

ご回答を頂きありがとうございます。 外部キーを一対一で設定するとは下記のようなイメージでしょうか。 Tables1 カラム1 主キー カラム2 外部キー カラム3 Tables2 カラム2 外部キー カラム4 カラム5 Tables3 カラム2 外部キー カラム6 カラム7 データの挿入については、1データつきTables1、Tables2、Tables3ごとにデータを登録するイメージでしょうか。
gentaro

2020/04/15 09:11

例えばTable1/2/3が同じ値を主キーとして持っており、Table2/3でTable1に対して、主キー同士で外部キー成約を張っていれば、Table2/3は1:1の関係になります。 まとめると Tables1 カラム1_1 主キー カラム1_2 カラム1_3 Tables2 カラム2_1 主キー/外部キー →Table1.カラム1_1 カラム2_2 カラム2_3 Tables3 カラム3_1 主キー/外部キー →Table1.カラム1_1 カラム3_2 カラム3_3 みたいな。 > データの挿入については、1データつきTables1、Tables2、Tables3ごとにデータを登録するイメージでしょうか。 回答に書いてあるとおり、今のままの実装はお勧めはしませんが、どうしてもというならそうなります。
gentaro

2020/04/15 09:14

Table2/3が固有の主キー(サロゲートキー等)を保つ場合は、Table1に対する外部キーの項目にUNIQUE成約を張らないとTable1:Table2が1対多になりますんで、まぁそういう作りをするのならそこだけ気をつければ良いんじゃないでしょうか。
tomato01

2020/04/15 09:19

ご回答を頂きありがとうございます!お伝え頂いたやり方でやってみます。ちなみに「普通に行にした方が良くないですか?」とはどういう意味合いでしょうか。
gentaro

2020/04/15 09:29

それぞれのカラムがどんなデータかわかんないので可能かどうかわかりませんが、たとえば テーブル:マスタ ID, 名前 1, データA 2, データB みたいにまずマスタになるテーブルを用意し、それぞれの属性のうち論理的に同じグループになるもの(かつ値の型が同一のもの)は個別にテーブルを用意して テーブル:属性グループ1 ID, データID, 属性ID, 値 1, 1, 1, ○○ 2, 1, 2, ×× 3, 1, 3, △△ 4, 2, 1, △△△ 5, 2, 2, ○○ みたいにして、「あるデータと、それに付随する属性」の1対多関係のテーブルを作るイメージをしてました。 まぁ400個の属性がグループ化できないほど全部バラバラだと意味ないっすけど。
tomato01

2020/04/15 09:39

なるほど、イメージがつきました。ありがとうございます!
tomato01

2020/04/16 01:42

すみません、可能でしたらもう少し教えて欲しいのですが、 教えて頂いた下記のような状態の場合、 Tables1 カラム1_1 主キー カラム1_2 カラム1_3 Tables2 カラム2_1 主キー/外部キー →Table1.カラム1_1 カラム2_2 カラム2_3 Tables3 カラム3_1 主キー/外部キー →Table1.カラム1_1 カラム3_2 カラム3_3 登録したレコードをselectで参照する際は、どのような記述をすればいいのでしょうか。 (関連する全てのカラムを参照する場合)
guest

0

まず素朴な疑問ですが、正規化しても400列必要なのでしょうか。たとえば「電話番号1」、「電話番号2」のように、別途切り出すべき、同種の値複数を列に開いて持っている、ということはありませんか?

投稿2020/04/15 08:34

編集2020/04/15 08:37
maisumakun

総合スコア145183

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

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

tomato01

2020/04/15 08:42 編集

ご質問ありがとうございます。扱っているデータが不動産系の物件データであり、フラグや詳細内容が多数ある感じです。また、決まったフォーマットのCSVからDBへの取り込みを考えており、カラム数はそのフォーマットに合わせておく必要があります。
maisumakun

2020/04/15 08:42

> 決まったフォーマットのCSVからDBへの取り込みを考えており、カラム数はそのフォームあっとに合わせておく必要があります。 この前提を崩してください。入出力時に変換すれば、CSVのフォーマットどおりにDBを起こす必要はなくなります。
maisumakun

2020/04/15 08:43 編集

(情報元によってデータ構造は大幅に違ってきますので、「未来永劫1ソースに頼る」のでなければ、どうせ変換は必要になります)
gentaro

2020/04/15 08:44

普通に考えれば1件のデータに400も属性があるなら、今後も頻繁に項目が追加されたりしそうなんで、RDB向きじゃない気はします…。
tomato01

2020/04/15 08:58

ご回答を頂き誠にありがとうございます。お伝えを頂いた通り入出力時に変換を検討することに致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問