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

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

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

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Q&A

解決済

1回答

848閲覧

SQLでINSERT INTO時に、あるテーブルの1つのカラムに外部キーで繋がった別のテーブルの値を入れたい

ao_tombo

総合スコア7

MySQL

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

0グッド

0クリップ

投稿2023/03/10 05:09

編集2023/03/10 08:54

下記のようにテーブルを2件作成(Djangoにより自動作成されたもの)し、自分で書いたSQLクエリによりusersテーブルにユーザーを1件挿入しました。

SQL

1/* Djangoにより作成されたものをコピペ */ 2CREATE TABLE "users" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "password" varchar(128) NOT NULL, "email" varchar(100) NOT NULL UNIQUE); 3 4CREATE TABLE "profile" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "nickname" varchar(32) NOT NULL, "family_name" varchar(32) NOT NULL, "given_name" varchar(32) NOT NULL, "gender" varchar(1) NOT NULL, "user_id" bigint NOT NULL UNIQUE REFERENCES "users" ("id") DEFERRABLE INITIALLY DEFERRED); 5 6/* 自分で発行 */ 7INSERT INTO `users` (email, password) VALUES ('john@lennon.com', ‘onoyoko');

次にprofileテーブルに、上記で作成したユーザーに対応するレコードを挿入したかったのですが、どのようにすれば良いのか分かりません。
特に外部キーを指定しているprofile.user_idに対してどのようにすれば値を入れれるのかが分かりません。

INSERT INTO ~ SELECT ~ を使って、

SQL

1INSERT INTO profile(user_id) SELECT id FROM users WHERE email=‘john@lennon;

ではprofile.user_id以外のカラムに情報を入れられないと思いますし。

例えば以下のようなレコードを登録するにはSQLクエリをどのように変更すれば良いのでしょうか?

SQL

1/* `profile`.`user_id`に`users`.`email`=‘john@lennon.com’に対応する`users`.`id`を入れたい */ 2INSERT INTO `profile` (user_id, nickname, family_name, given_name, gender) 3VALUES ('imagin', 'Lennon', 'John', ‘M’);

教えていただけたらありがたいです。
宜しくお願いします。

補足情報(FW/ツールのバージョンなど)

使用FW: Django
使用DB: SQLite3 / MySQL

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

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

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

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

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

yambejp

2023/03/10 05:14

SQLite3 / MySQLとは結局どっちなんでしょう?
phper.k

2023/03/10 05:18 編集

`テーブル名` は MySQL で、"テーブル名" はSQLite だよな〜 なんか適当に質問文作ってる? ベンダー異なるSQL間で接続しなきゃいけないのかとも読み取れる?
ao_tombo

2023/03/10 06:07

ごめんなさい。実はDjangoが自動的に作成したテーブルに対して、ファイルに書き込んだSQL文を読み込ませてテスト用のユーザーを入れ込もうと思ったのです。スクリプトでも良かったのですが、SQL文を読み込ませた方が早いと思いまして。で、SQLite3、MySQL共にそのユーザーを入れようと思っていたのでこういう質問文になりました。 質問時はSQLiteでクエリが発行されていたようです。変更せずそのままCREATE文を書いてしまいました。
guest

回答1

0

ベストアンサー

命題に情報不足がありますが、適当に補完して

mysqlで回答

SQL

1CREATE TABLE `users` ( 2`uid` int PRIMARY KEY AUTO_INCREMENT, 3 `password` varchar(128) NOT NULL, 4 `email` varchar(100) NOT NULL UNIQUE 5); 6 7CREATE TABLE `profile` ( 8`pid` int PRIMARY KEY AUTO_INCREMENT, 9`nickname` varchar(32) NULL, 10 `family_name` varchar(32) NULL, 11`given_name` varchar(32) NULL, 12 `gender` varchar(1) NULL, 13 `uid` int NULL UNIQUE , 14FOREIGN KEY (`uid`) 15REFERENCES `users` (`uid`) 16ON UPDATE CASCADE 17ON DELETE SET NULL 18); 19 20DROP TRIGGER IF EXISTS insert_profile; 21DELIMITER // 22CREATE TRIGGER insert_profile AFTER INSERT ON users 23 FOR EACH ROW 24 INSERT 25 INTO profile(uid) VALUES ( 26 new.uid 27 ); 28// 29DELIMITER ;

ここでuserにデータを投入する

SQL

1INSERT INTO `users` (email, password) VALUES ('john@lennon.com', 'onoyoko');

自動的にprofileにデータが追加される。
ただし情報が不足しているのでprofileの殆どの値はnullです
※命題ではprofileをnot null指定しているのが意味不明。もしそうならDEFAULT値を設定する必要があります

追記

usersテーブルに入れるタイミングでprofileも更新

SQL

1BEGIN; 2INSERT INTO `users` (email, password) VALUES ('a1', 'b1'),('a2', 'b2'),('a3', 'b3'); 3insert into profile(uid,nickname,family_name,given_name,gender) 4select * from(select t1.uid, 5COALESCE(ELT(num,'c1','c2','c3'),nickname), 6COALESCE(ELT(num,'d1','d2','d3'),family_name), 7COALESCE(ELT(num,'e1','e2','e3'),given_name), 8COALESCE(ELT(num,'1','2','1'),gender) 9from profile as t1 10inner join ( 11select uid,FIELD(email,'a1','a2','a3') as num 12from users 13) as t2 14on t1.uid = t2.uid) sub 15on duplicate key update 16nickname=values(nickname), 17family_name=values(family_name), 18given_name=values(given_name), 19gender=values(gender) 20; 21COMMIT;

(ダブりを調整)

投稿2023/03/10 05:37

編集2023/03/10 08:23
yambejp

総合スコア114812

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

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

ao_tombo

2023/03/10 07:12 編集

回答ありがとうございます。なるほど、CREATE TRIGGERを使う方法、参考になりました。質問のCREATE文はDjangoが自動作成してまして、Djangoの仕様でこうなっています。そこにスクリプトではなく、SQLのクエリでテスト用のユーザーを入れ込んでいこうと考えたのですが、詰まっていました。仕様なのでCREATE文を変更することはできないのですが(NULLやDEFAULTは変更可)、CREATE TRIGGERは参考になりました。後はUPDATE ~ WHERE `users`.`id` = `profile`.`user_id`などから、DROP TRIGGER ~ でいけそうな気がするので試してみます。ありがとうございました。
ao_tombo

2023/03/10 08:50

yambejpさん、追記の回答までいただきありがとうございました。これは.....凄いですね!この回答は今の自分には思い付きません。大変勉強になりました。感謝致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問