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

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に必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

6回答

10475閲覧

SELECT INSEERTを使用して、列数の違うテーブルにデータを追加したい(NOTNULL制約有り)

nekomura

総合スコア132

MySQL

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

SQL

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

1グッド

1クリップ

投稿2016/07/13 02:01

編集2016/07/13 02:06

以下のテーブルが二つあります。
SELECT INSEERTを使用して、元のテーブルに他のテーブルのデータを追加したいのですが、
下記条件の際の記述方法がわかりません。
どうぞよろしくお願いいたします。
DBはMYSQLです。

・元のテーブルT_1が15列(列名は仮にA~Oとする)
・追加したいテーブルT_2は2列(列名はP,Qとする)

・元になるテーブル「T_1」→現在空のテーブル。数列にNOT NULL制約がかかっている。
・追加したいデータの入ったテーブル「T_2」→列P、Qそれぞれ全てに値が入っており、数は一万件。

■実現したい結果→元になるテーブル「T_1」の、A,B列に、
■追加したいデータの入ったテーブル「T_2」のP,Q列を追加して、T_1テーブルを完成させたい。

↓単純に下記SQL文を書いても、NOT NULL制約により、
他の列の値がDEFAULTで無いと怒られエラーになります(当たり前ですが)。

insert into T_1(A,B) select P,Q from test.T_2

↓元になるテーブル「T_1」のinsert文として、

insert into tana_mddb.mgoods( C, D,… O) values( name, hoge,… foo)

も作ってみて、Google検索では「サブクエリ insert文」など検索して試行錯誤したのですが、
**SQL初心者の為、これ以上記述方法が分からなくて手詰まりです。

**
有職者の皆様、どうぞ本件についての正しい記述法をご教示いただけないでしょうか。
よろしくお願いいたします。

mondaminZ👍を押しています

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

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

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

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

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

guest

回答6

0

回答としてはみなさんおっしゃっているように、NOT NULL制約がかかっている各列に値を入れる、ということになりますね。

考え方というか、進め方としては、

  • T_1 の A,B他NOT NULL制約のかかっているフィールドを書き出す→ (A, B, C, N, O) など
  • T_2 に対するSELECT文で、上記に対応する表を作る。その際、T_2 にないフィールドについては適切な値を固定値で与える。 →(SELECT P, Q, 0, "dummy", 0 FROM T_2)
  • 上記を組み合わせる

としていくと、間違わないのではないでしょうか。

投稿2016/07/13 02:37

kaz.Suenaga

総合スコア2037

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

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

nekomura

2016/07/13 03:49

suenaga様 いつもお世話になっております。 >T_2 にないフィールドについては適切な値を固定値で与える。 この考え方が、こちらでで質問するまで分からなかったので、現状うまくいきそうです。 また、nullのある行についてはifnullを使い解決しました。 ありがとうございました!
guest

0

ベストアンサー

テーブルT_2のデータを登録する行のテーブルT_1のA,B項目以外の項目でNot Null制約がかかっている項目に対してはどのような値を登録するのが正解でしょうか。

Not Null制約がかかっている項目も含めてinsert select文を作成してみてはいかがでしょうか。
A,B以外の項目仕様(制約、登録値)が不明なので適当ですが、以下のような感じです。

SQL

1 2-- C,DにNot Null制約があり、それぞれ固定値"hoge", "fuga"を初期値として登録したい場合 3insert into T_1(A, B, C, D) 4 select P, Q, "hoge", "fuga" 5 from test.T_2 6

投稿2016/07/13 02:18

takyafumin

総合スコア2335

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

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

nekomura

2016/07/13 03:52

takyafumin様 このやり方でほぼうまくいきました。 また、実行の際にまた、nullのある行があり、エラーになってしまったのですがそれについてはifnullを使い解決しました。 解決への具体的内容を一番早くにいただけたのでベストアンサーとさせていただきます。 ありがとうございました。
guest

0

INT のNOT NULLは特に指定しなければデフォルトは0になるはずだけど・・・
普通に挿入できません?

MySQL

1create table T_1( 2A int not null, 3B int not null, 4C int not null 5); 6create table T_2( 7P int null, 8Q int null 9); 10insert into T_2 values(1,1),(2,null),(null,3),(null,null);

というデータに対して

MySQL

1insert into T_1(A,B) select P,Q from T_2;

しても弾かれることはないと思いますが?

投稿2016/07/13 02:58

yambejp

総合スコア114829

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

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

nekomura

2016/07/13 03:54

yambjp様 >INT のNOT NULLは特に指定しなければデフォルトは0になるはず そうなんですね、今回は、intの列が無かったのですが勉強になりました! ありがとうございます。
guest

0

NULL を許容するのであれば、NOT NULLを外すのが正しいと思います。
逆に NULL を許容しないのであれば、データをきちんと成形して、INSERTすべきかと。
テストならダミーデータを作成して成形するのが良いかと思います。

投稿2016/07/13 02:34

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nekomura

2016/07/13 03:56

te2ji様 ご回答ありがとうございます。 すでに仕様を決められたテーブルの為、NOTNULLは外せませんでしたが、 なんとか解決しました。 ありがとうございました。
guest

0

NOTNULL規制が入っている列に、空文字列などを代入するよにしてください。
たとえば、T_1のC列がNOTNULLなら

insert into T_1(A,B,C) select P,Q,'' AS C from test.T_2
で出来ませんか?

投稿2016/07/13 02:15

jm1156

総合スコア866

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

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

nekomura

2016/07/13 03:46

jm1156様 >NOTNULL規制が入っている列に、空文字列などを代入 このやり方で実現に近づきました、アドバイスに感謝です。
guest

0

簡単ですがこんな感じでは、どうでしょうか、デフォルト値は0とましたが
insert into T_1(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O) select P,Q,0,0,0,0,0,0,0,0,0,0,0,0,0 from test.T_2

投稿2016/07/13 02:12

A.Ichi

総合スコア4070

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

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

nekomura

2016/07/13 03:44

A.Ichi様 なるほど、それぞれのテーブルの列数を合わせて、仮の値を入れるということですね。 insert select文について認識がまだ浅かったのですが、勉強になりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問