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

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

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

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

SQL

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

Q&A

解決済

4回答

2943閲覧

存在しないときだけ挿入、をカラムの値が重複するレコードで行いたい

kft123

総合スコア12

MySQL

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

SQL

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

0グッド

0クリップ

投稿2018/09/05 14:54

編集2018/09/06 11:06

前提・実現したいこと

Mysqlで、テーブルにレコードが存在しないときだけ挿入をしたいが、カラムの値に重複するものがあった場合
Duplicate Column Nameで挿入が行えない

発生している問題・エラーメッセージ

Duplicate Column Name '1'

該当のソースコード

MySQL

1INSERT INTO USER(USER_ID 2 ,USER_NAME 3 ,ADMIN_FLG 4 ,SUPER_FLG) 5 SELECT * FROM (SELECT 'TESTID' 6 ,'TESTNAME' 7 ,1 8 ,1) AS TEMP 9 10 WHERE NOT EXISTS (SELECT * FROM USER 11 WHERE ADMIN_FLG = 1 12 AND SUPER_FLG = 1);

型名等は今使っているものとは違うのですが、イメージとしてはこのような・・・
存在しないときのみ挿入にした場合、挿入する値はVALUESではなくSELECTで出すとのことだったので
このような形になりましたが、その結果値が重複するものがあった場合エラーとなってしまいました。

※追記:上にも書いてる通り、型名等は実際使っているものとは異なっており、単純に同じ値のデータが存在する中で
NOT EXISTSと合わせての挿入をする方法が知りたかったのですが、例としてあげたものがわかりづらく
混乱を招く結果となってしまったようで申し訳ありません。

回答として、自分がしたかったことに対して的確だったOrlofskyさんの回答をベストアンサーとして
勝手ながら解決済みとさせていただきます。

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

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

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

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

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

guest

回答4

0

色々突っ込みどころが多いですね。
USERテーブルのプライマリーがUSER_IDなら、ADMIN_FLGやSUPER_FLGがONじゃなくてINSERTしようとしてもキー重複です。

システム管理者を必ず設定するという意図なら、UPSERTを行えば良く
以下の様になるかと思います。

SQL

1INSERT INTO USER(USER_ID, USER_NAME, ADMIN_FLG, SUPER_FLG) 2VALUES('TESTID', 'TESTNAME', 1, 1) 3ON DUPLICATE KEY UPDATE ADMIN_FLG=1, SUPER_FLG=1

投稿2018/09/06 03:49

sazi

総合スコア25138

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

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

0

ベストアンサー

CREATE TABLE文や現状のデータがどうなっているかを載せてくれそうもないので、一部だけ。WHERE句は自分で考えてね。

SQL

1 SELECT * FROM (SELECT 'TESTID' 2 ,'TESTNAME' 3 ,1 4 ,1) AS TEMP

SQL

1 SELECT 'TESTID' 2 ,'TESTNAME' 3 ,1 AS ADMIN_FLG 4 ,1 AS SUPER_FLG 5 FROM USER

投稿2018/09/06 02:45

Orlofsky

総合スコア16415

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

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

0

重複する箇所のみ、更にSELECT文にして退避させることで挿入することが出来ました。
もし他にもっとよい方法等あればご教授いただけると助かります・・・。

MySQL

1INSERT INTO USER(USER_ID 2 ,USER_NAME 3 ,ADMIN_FLG 4 ,SUPER_FLG) 5 SELECT * FROM (SELECT 'TESTID' 6 ,'TESTNAME' 7 ,(SELECT * FROM (SELECT 1) AS TEMP2) 8 ,1) AS TEMP 9 10 WHERE NOT EXISTS (SELECT * FROM USER 11 WHERE ADMIN_FLG = 1 12 AND SUPER_FLG = 1);

投稿2018/09/05 22:30

kft123

総合スコア12

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

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

Orlofsky

2018/09/05 22:59 編集

質問のSQLを修正してください。CREATE TABLE文も載せては? 無駄にインラインビューを多用するのは止めましょう。INSERT ... SELECT のSELECTは1つだけで済むのでは?
kft123

2018/09/06 01:51 編集

質問の方を修正してしまうと、元々どういうコードで詰まっていたのかがわからなくなるかと思いこのような形を取らせていただきました。 インラインビューはとりあえずコードならば使ったほうがいいのかなと・・・以降気をつけます。 INSERT ... SELECT のSELECT文がどのSELECT文を指しているのかがいまいちわかりかねますので もう少し具体的に示していただけると助かります。
yambejp

2018/09/06 02:23

具体性がないのは質問者さんの提示内容ですね USERテーブルの各カラム名、データ型、制約がどうなっているか 具体的にどういったデータを挿入したときにどういう根拠で弾きたいのか明示してください
guest

0

ひとまず実現したいことを検索してみましたか?
MySQLだと INSERT IGNORE などの例がすぐヒットします。

2018-09-06 追記

create table items (a text, b text, c int, d int); INSERT INTO items (a, b, c, d) SELECT * FROM (SELECT 'TESTID' as a, 'TESTNAME' as b, 1 as c, 1 as d) AS TEMP WHERE NOT EXISTS (SELECT * FROM items WHERE c = 1 AND d = 1);

カラム名と認識されるのが問題なので、 as を付けてカラムを明示すれば普通に動きますよ。

投稿2018/09/05 16:47

編集2018/09/06 10:20
mather

総合スコア6753

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

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

mather

2018/09/05 16:50

そもそものエラーをちゃんと訳してみると、「カラムの名前が重複している」と書かれているのは気づいていましたか?(レコードの重複ではない) 途中のSELECT文の 1, 1 の部分がカラム名と解釈されているのです。
kft123

2018/09/05 21:26

それは承知なのですが・・・VALUESでの値の指定ができず、調べたところこの表記での 挿入しか出てこなかったため現在困っているというところです。 また、ignoreの場合、通常挿入ならばエラーと言う状態を防ぐことしかできず、今回 自分のやりたいことは挿入出来たとしてもエラーするものではないので ignoreでは挿入が出来てしまうのです・・・情報が足りず申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問