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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

Q&A

解決済

3回答

1759閲覧

mysql オートインクリメントとプライマリーキーについて

raterate

総合スコア12

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

0グッド

1クリップ

投稿2017/12/26 04:02

###タイトルの件についてご質問です
データベースにカラムを設定する際、
A_Iと主キー(それぞれ名前が長いので省略させていただきます)を設定しているのですが、
主キーの働きが理解できません。

<自分が調べた結果の解釈>
A_Iは登録するデータの重複が無いように自動でidを振り分ける機能
主キーは登録したデータに仮に同じデータがあったとしても、重複がないように識別しているもの?

自分の解釈ではA_Iだけでいいのでは?と思っております。

教えてください。よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

主キーは、ユニーク制約やインデックス等を提供します。
A_Iは、これに自動インクリメント機能を付け加えるだけです。

A_Iだけだと、ユニーク制約もなければ、インデックス機能もありません。
これでは使い物にならないので、主キー等のユニークカラムにしか設定できなくなっています。

また、主キーはデータ型に制限がありませんが、A_Iは整数型にしか使えません。
主キーを整数連番にすることが多いので、結果的にA_Iとセットにして使うことが多いだけです。

投稿2017/12/26 06:04

Norimso

総合スコア29

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

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

raterate

2017/12/26 07:01

Norimsoさん ご回答ありがとうございます。 A_Iは自動連番のみの機能 主キーはルールを持っている機能 結果的にデータ型でみた場合、セットとして使うことがある。 上記認識で大丈夫でしょうか?
Norimso

2017/12/26 07:08

その通りになります。
raterate

2017/12/26 07:18

ありがとうございます! 勉強になりました!
tacsheaven

2017/12/26 08:12

一応、MySQL では浮動小数点型(float, double)に対する auto_increment も可能です。誰もそんなことに使わないですが。
raterate

2017/12/26 09:08

tacsheavenさん ご回答ありがとうございます。
guest

0

ベストアンサー

  • INSERT時に自動で値を振って登録してくれるのが、AUTO_INCREMENT
  • すでに存在する値をINSERTしようとした時にエラーで登録させないのが、主キーによる制約(正確には一意性制約)

投稿2017/12/26 06:36

rkojima

総合スコア421

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

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

raterate

2017/12/26 06:59

rkojimaさん ご回答ありがとうございます。 シンプルでスッと理解できた感じがしました。 自分の言葉として理解したいので、あえて復唱?させていただきます。 INSERT時に自動で値を振って登録してくれるのが、AUTO_INCREMENT →登録時に自動で割り振ってくれるものがA_I すでに存在する値をINSERTしようとした時にエラーで登録させないのが、主キーによる制約 →もともとある値と被らせないように設定するのが主キー 自動で振る役割なのか、既存する値と被らせない役割なのか の違いと認識しました。 それがidというユニークな値で区別した方が管理しやすい?為、 同じ値にA_Iと主キーがつくことがある。 上記の認識で大丈夫でしょうか?
rkojima

2017/12/26 08:12

だいたいの理解は大丈夫です。 > それがidというユニークな値で区別した方が管理しやすい?為、 > 同じ値にA_Iと主キーがつくことがある。 補足すると、MySQLなどのデータベースの決まりとして、A_Iはなにかしらインデックス(KEY)が設定されたカラムにしかつけれないのです。 で、どうせA_Iつけるなら「一意な値が確実に振られている」ことも制約として付けたほうが管理が楽だと。 (UPDATE/DELETEで特定の1レコードだけ指定したいときとか) → A_Iだけ設定で「id=5が2個あるかもしれない」状態だと、特定の1レコードだけの指定ってしにくいですよね。 以下は、ややこしいので、完全に蛇足です。。 > →もともとある値と被らせないように設定するのが主キー 「もともとある値と被らせない」は「一意性制約」と呼ばれるもので、ほかにも`UNIQUE KEY`というものがあります。 `PRIMARY KEY`は、この「一意性制約」と「NOT NULL制約」(NULLを禁止)が合わさったものになります。 ・PRIMARY KEY => 同じ値もダメだし、NULLもダメ ・UNIQUE KEY => 同じ値はダメだけど、NULLはOK。しかもNULLは(値じゃないので)何個でもOK ・NOT NULL制約 => NULLはダメ
raterate

2017/12/26 09:06

rkojimaさん ありがとうございます。 補足につきましても、大変勉強になります。 今は深く考えずに今の理解で進めていきたいと思います。 完全の蛇足については確かにまだ自分の中で難しい内容です。。。 でも進めていくにつれて点と点が線になる日を目指して頑張ります。 ありがとうございました。
guest

0

autoincrementはユニーク制約が必要ですので
いずれにしろ主キーかユニークキーの属性をつける必要があります。
主キーの本来の目的であるレコードを特定するIDの機能を補足するための
機能だと考えれば良いと思います

投稿2017/12/26 04:18

yambejp

総合スコア114572

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

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

raterate

2017/12/26 04:42

yambe.jpさん ご回答ありがとうございます。 イマイチピンときません。 >>主キーの本来の目的であるレコードを特定するIDの機能を補足するための 機能だと考えれば良いと思います 結局A_Iと同じでは?補足する必要がなぜあるのか? ってより思ってしまいました。 もう少し説明をいただいてもよろしいでしょうか?
yambejp

2017/12/26 05:11

DBの仕組み上レコードを特定する必要があるのはご理解されていますか? 任意のレコードを更新・削除をするときにはそのレコードをユニークに 抽出する必要があるわけです。それが主キー。 もしautoincrementがなければユーザーは自らの責任と裁量で ユニークになるであろうIDをレコードに主キーとして埋め込まなくてはいけません。 そもそも主キー自体はレコードをユニークに特定するだけの目的ですので ほとんどの集計では利用されることはありません。 普段利用しないものためにユーザーがユニークなIDの振り出しをするのは無駄ですので オートインクリメントという機能が提供されています autoincrementはそのカラムの最大値に1をたすので理論上常にユニークになるのは自明ですので。 (厳密に言うとレコードの最大値ではなく、インデックスされた最大値)
raterate

2017/12/26 07:03

yambe.jpさん ご回答ありがとうございます。 今回はrkojimaさんよりいただいた回答が自分の中でスッと理解できた感じがしました。 ご丁寧にご回答をいただいたにも関わらず、yambe.jpさんのお時間だけをいただいた感じがして申し訳ないです。 またどうぞよろしくお願いいたします。
rkojima

2017/12/26 08:18

yambejpさん >主キーかユニークキーの属性をつける必要があります。 MySQL(5.6.38)では、ユニーク制約は必須ではないようです。(インデックスは必須ですが)
yambejp

2017/12/26 08:32

rkojimaさん、ありがとうございます。 改めて確認しました。たしかにいまはunique属性不要ですね きちんと仕様を追いかけていませんでした、失礼しました。 そうなると余計にauto incremetだけではレコードを特定できないですね
raterate

2017/12/26 09:07

yambejpさん 色々とありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問