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

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

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

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

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

SQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

3回答

4661閲覧

MySQLでINSERTする際, 特定のカラムについて重複を許さないコードの書き方

pythonista

総合スコア21

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

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

SQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/06/18 04:12

やりたいこと

例えば以下のテーブルについて、

社員番号名前出身地
0001佐藤太郎北海道
0002鈴木次郎青森
0003高橋三郎岩手
0004田中四郎秋田
0005伊藤五郎宮城 
0006渡辺六郎山形
0007山本七郎福島
0008中村八郎茨城

以下のような新情報について区分けしてINSERTしたい

INSERTする情報

社員番号名前出身地
0009小林九郎栃木

INSERTしない情報

社員番号名前出身地
0009加藤十郎北海道

すなわち同一出身地である人をデータベースにINSERTしないコードを書きたい。

ここでのPrimary Keyは社員番号

現状のコード

うまくいっていないコード

INSERT INTO items VALUES (社員番号, 名前, 出身地) WHERE 出身地 NOT EXISTS (SELECT 出身地 FROM items)
INSERT INTO items VALUES (社員番号, 名前, 出身地) WHERE 出身地 NOT IN (SELECT 出身地 FROM items)

このコードを改変するにはどうしたら良いでしょうか。
よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2021/06/18 04:21

コードではなくテーブル定義での対応は考えてませんか? それにinsertに直接whereはつけられないのでは。
sazi

2021/06/18 05:41 編集

既に登録されていないものを登録しないようにするには、ユニーク制約などでいいのですが、 0009 小林九郎 栃木 0009 加藤十郎 北海道 上記のデータを同時に登録する場合という事なら、話は違っていて、どのような条件で優先するものを決めるのかのルールが必要になってきます。
guest

回答3

0

基本的には出身地カラムにユニーク制約を付与したあと、INSERT IGNOREを使うのが良いとは思います。

SQL

1ALTER TABLE items ADD UNIQUE(出身地); 2INSERT IGNORE INTO items (社員番号, 名前, 出身地) VALUES ('0009', '小林九郎', '栃木'); 3INSERT IGNORE INTO items (社員番号, 名前, 出身地) VALUES ('0009', '加藤十郎', '北海道');

ただスキーマ定義の更新が難しい場合、以下のようなクエリでやりたいことは実現できると思います。

SQL

1INSERT INTO items 2SELECT * 3FROM (SELECT '0009', '小林九郎', '栃木') A (社員番号, 名前, 出身地) 4WHERE NOT EXISTS (SELECT * FROM items I WHERE A.出身地 = I.出身地); 5 6INSERT INTO items 7SELECT * 8FROM (SELECT '0009', '加藤十郎', '北海道') A (社員番号, 名前, 出身地) 9WHERE NOT EXISTS (SELECT * FROM items I WHERE A.出身地 = I.出身地);

投稿2021/06/18 08:22

neko_the_shadow

総合スコア2343

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

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

退会済みユーザー

退会済みユーザー

2021/06/18 08:56

一致するのがあればSELECTの結果としてレコードなしが返ってきてINSERTされず、 一致するのがない場合だけSELECTの結果で出てくるのでINSERTされると。 COOLだ。
guest

0

普通にやればすでに回答があるとおりunique属性ではじく案件ですが
どうしてもSQLだけでやりたいならこれでいけるかも。

SQL

1INSERT INTO items select * from ( 2select 9 ,'小林九郎',@a:='栃木' from items having sum(birthplace=@a)=0 3) as sub; 4INSERT INTO items select * from ( 5select 9 ,'加藤十郎',@a:='北海道' from items having sum(birthplace=@a)=0 6) as sub; 7

投稿2021/06/18 05:26

yambejp

総合スコア115976

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

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

0

出身地、に対してunique indexのconstraintを設定したら?

sql

1alter table `テーブル名` add constraint unique index (`出身地`)

みたいな。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.1.7 ALTER TABLE 構文

でも、いきなりINSERT INTO文をぶつけて制約に違反したってエラーを発生させるよりも、
事前に重複しないかをSELECT文実行した方がいいんでない?

INSERT INTO文でできることは、せいぜい
主キーが重複したから無視するor更新クエリーに切り替える、
ってくらいかと。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.5 INSERT 構文

一貫性や整合性を検査する役割は予めテーブルに対して制約constraintや
外部参照キーforeign keyなどでやるもので、
都度挿入クエリーや更新クエリーでやることじゃない。
直前に選択クエリーして判断する、ってことになるかと。

投稿2021/06/18 04:27

編集2021/06/18 04:37
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問