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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

2回答

1666閲覧

INSERT INTO で他のテーブルからデータを取得したい

NakaShun_1129

総合スコア20

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2020/08/06 02:53

現在初期データ投入のためのファイルを作成しています。

  1. USERSテーブルにデータ投入
  2. USERS_PROPERTIESてテーブルにデータ投入

(ここでuser_idに1で投入したユーザーのIDを入れたい)

こんな感じでinsertファイルを作成しているのですが上手くいきません。

↓エラー内容です。

 USERS_PROPERTIESテーブルのis_rootにNOT NULLがかかっているのでそこで弾かれます

error: error: null value in column "is_root" violates not-null constraint
INSERT INTO "USERS_PROPERTIES"( user_id ) SELECT "USERS".id FROM "USERS" WHERE id = 1; INSERT INTO "USERS_PROPERTIES"( id, is_root, title, status) VALUES( 1, 'true', 'ceo', 'busy');

ここの順番を変えると今度はuser_idが空です。というエラーになってしまいます。


#テーブル設計

USERS
|id|uid|name|email|first_name|last_name|gender|
|:--|:--:|--:|
||||

USERS_PROPERTIES
|id|is_root|title|status|user_id|
|:--|:--:|--:|
||NOT NULL||


#全体コード

typescript

1import { createConnection, EntityManager } from "typeorm"; 2 3const main = async () => { 4 const connection = await createConnection(); 5 const entityManager = await connection.manager; 6 await runner(entityManager, createUsersData); 7 await runner(entityManager, createUserpropertiesData); 8 await connection.close(); 9}; 10 11main().then(() => console.log("completed")); 12 13const runner = async ( 14 entityManager: EntityManager, 15 creater: (entityManager: EntityManager) => Promise<any> 16) => 17 creater(entityManager) 18 .then(() => console.log(`created`)) 19 .catch((v) => console.log(`failed: ${v}`)); 20 21const createUsersData = (entityManager: EntityManager) => 22 entityManager.query(` 23 INSERT INTO "USERS" ( id, uid ,email, first_name, last_name, gender) VALUES(1, 1, 'aaa@aaa', '山田', '太郎', 'male'); 24 `); 25 26 const createUserpropertiesData = (entityManager: EntityManager) => 27 entityManager.query(`; 28 INSERT INTO "USERS_PROPERTIES"( user_id ) SELECT "USERS".id FROM "USERS" WHERE id = 1; 29 INSERT INTO "USERS_PROPERTIES"( id, is_root, title, status) VALUES( 1, 'true', 'ceo', 'busy'); 30 `); 31 32

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

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

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

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

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

Orlofsky

2020/08/06 03:03

テーブル定義は各列のデータ型や桁数を明確にするために、CREATE TABLE文に修正してください。Markdown のコード で提示願います。
guest

回答2

0

ベストアンサー

2つの対応方法があると思います。

1.テーブル定義を変更し、NOT NULLのカラム定義に「デフォルト値」を設定する。
→INSERT時にその項目が未指定であれば、「デフォルト値」が設定されます。

2.固定値部分を、SELECT文の取得結果に「固定値」として記載する。

sql

1INSERT INTO "USERS_PROPERTIES"( id, is_root, title, status, user_id ) SELECT 1, 'true', 'ceo', 'busy', "USERS".id FROM "USERS" WHERE id = 1;

投稿2020/08/06 04:43

nak

総合スコア696

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

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

0

何故エラーになるかは理解されていると思いますが、何故usersの情報を元にinsertしないと駄目なんですか?

usersの抽出をuidで行ってidをuser_idにするとかなら理解は出来ますが。

意図は不明ですけど、insertを分けなければエラーにはならないですから、以下の様な記述ができます
※valuesで指定する値にもサブクエリーが使用できます

SQL

1INSERT INTO "USERS_PROPERTIES"( id, is_root, title, status, user_id) 2VALUES 3 ( 1, 'true', 'ceo', 'busy', (SELECT id FROM "USERS" WHERE id = 1))

※直接関係はありませんがテーブル名は大文字で無いと駄目なのでしょうか?
"で括らないと駄目なのは面倒では無いですか?

投稿2020/08/06 04:32

編集2020/08/06 10:12
sazi

総合スコア25206

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問