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

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

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

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

Q&A

3回答

1421閲覧

ユニークではない複数のカラムが全て重複するときだけinsertをしない方法

Palo_Punte

総合スコア21

MySQL

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

0グッド

0クリップ

投稿2020/09/12 07:57

tabel名 human
カラム id,number,name,age //idはAUTO_INCREMENT

で、INSERT INTO human (number, name, age) VALUES (43, tatou, 13);
のようにinsertをします。

この時numberとnameが両方とも同じものがある時だけinsertをしないようにするにはどうすれば良いのでしょうか?
ユニークキーを使うやり方は調べて見つかったのですがnumberもnameも重複は存在します。ただ両方が同じレコードだけをinsertしないようにしたいのです。
片方だけ同じものはinsertしたいです。

mysql8を使用しています

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

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

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

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

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

hentaiman

2020/09/12 08:06

mysqlタグ単品しかついてないって事はmysqlオンリーでやりたいという事?
Palo_Punte

2020/09/12 08:07

golangでmysqlで書いています
hentaiman

2020/09/12 08:13

goは全く分からないけどフレームワーク使っているならそういう機能あるかもしれないのでお使いのフレームワークの機能を調べてみてはどうでしょう? 既にある程度のやり方は想像ついていての質問ですか?全く想像つかずですか?何も分からないなら他の言語でもやるような普通のやり方を回答ようとは思いますが
Palo_Punte

2020/09/12 08:25

まだwhere selectでゴリゴリと書くやり方をふんわりと思い浮かんでいるくらいでした 普通のやり方を教えて頂きたいです
guest

回答3

0

ユニークキーを使うやり方は調べて見つかったのですが

通常、制約だけに依存したノーチェックのプログラムは書きません。
制約はただの制約であって、insertエラーを吐かせるだけのものです。

自身で言われてる通り事前にselectして該当のレコードが見つからなければinsertしましょう。transaction(begin)と併用すれば対応出来ます。

SQLだけでやろうとするならストアドファンクションを利用する内容ですが、この程度あればプログラム側でselectして検査するのがお手軽です。

先に書いた通りエラーを吐かせるだけなので、事前のselectをしないのであればその補足の為だけにtry~catch(phpの場合)で括って対応する必要があります。
しかしgoには**try~catchに相当するものが無い(?)**ので、その時点でエラーです。
という事から、コードが単純で済むのは事前のselectでの検査です。

おまけで複合ユニークの例もリンクしときます

※goは分からないので、エラーハンドリングについては自身で適宜判断してください。

投稿2020/09/12 08:48

hentaiman

総合スコア6426

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

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

Palo_Punte

2020/09/12 10:23

goは_, err = stmt.Exec( )でerrorの場合はerr変数に自動でエラーが入るため簡単に場合分けができ制約のやり方でもできました ただfor文で1行ずつ確認をしてinsertをしないといけないのでinsertの時間はかかってしまいそうですが 一括insertで制約に引っかかるものだけinsertをしない機能があれば良いんですけどね でもとりあえず動くものはできました!ありがとうございます!
guest

0

ユニークキーを使うやり方は調べて見つかったのですがnumberもnameも重複は存在します。ただ両方が同じレコードだけをinsertしないようにしたいのです。

それがまさに、複合UNIQUE制約が成立させる条件です。

投稿2020/09/12 08:23

maisumakun

総合スコア146018

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

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

Palo_Punte

2020/09/12 08:42

複合ユニークと言うものもあるのですね ググってみたところそれらしい記事が出てきたのでみてみます! 全然知りませんでした。ありがとうございます!
guest

0

(number, name)のユニークインデックスを作成して、INSERT ... ON DUPLICATE KEY UPDATE 構文を使用するか、insert ignore intoを使用する。
なかったら insert あったら何もしない

但し、ignore はエラーを無視するものなので、キー重複以外のエラーも無視されます。

投稿2020/09/12 13:24

sazi

総合スコア25327

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問