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

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

ただいまの
回答率

89.64%

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

解決済

回答 6

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,542

nekomura

score 130

以下のテーブルが二つあります。
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)
 valuesname,
     hoge,…
     foo)


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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

checkベストアンサー

+2

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/13 12:52

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

    キャンセル

+2

回答としてはみなさんおっしゃっているように、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 12:49

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

    キャンセル

+1

簡単ですがこんな感じでは、どうでしょうか、デフォルト値は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 12:44

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/13 12:46

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/13 12:56

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

    ありがとうございました。

    キャンセル

+1

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

create table T_1(
A int not null,
B int not null,
C int not null
);
create table T_2(
P int null,
Q int null
);
insert into T_2 values(1,1),(2,null),(null,3),(null,null);

というデータに対して

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/13 12:54

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

    キャンセル

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

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる