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

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

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

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

SQL

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

1回答

486閲覧

主キーが無いテーブルが作成できてしまう

vj2a6wk5

総合スコア5

MySQL

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

SQL

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

1クリップ

投稿2023/11/07 08:11

編集2023/11/07 08:23

前提

MySQL(MariaDB)のインデックスについて勉強中です。
調べごとをしている途中で以下記事がヒットして、記事を読んで疑問に思いました。

特定のカラムに張るインデックスはセカンダリインデックスと呼ばれ、
セカンダリインデックスの葉ノードには主キーが必ず含まれています。

https://techlife.cookpad.com/entry/2017/04/18/092524

質問

セカンダリインデックスの葉ノードには主キーが必ず含まれています。

ということなので、以下2点の条件を満たすテーブルは作成できないと解釈しました。

  • セカンダリインデックスが有る
  • 主キーが無い

しかし、以下の通り作成できました。
なぜ、主キーが無いテーブルが作成できてしまったのでしょうか。

mysql> CREATE TABLE `test_table001` ( `col1` INT NULL, INDEX `col1` (`col1`) ); Query OK, 0 rows affected (0.011 sec)

試したこと

  • カラムを増やしてみた

テーブル作成に成功した。

mysql> CREATE TABLE `test_table002` ( `col1` INT NULL, `col2` INT NULL, INDEX `col2` (`col2`) ); Query OK, 0 rows affected (0.011 sec)

全SQL

mysql> create database test_db; Query OK, 1 row affected (0.001 sec) mysql> use test_db; Query OK, 0 rows affected (0.011 sec) mysql> CREATE TABLE `test_table001` ( `col1` INT NULL, INDEX `col1` (`col1`) ); Query OK, 0 rows affected (0.011 sec) mysql> CREATE TABLE `test_table002` ( `col1` INT NULL, `col2` INT NULL, INDEX `col2` (`col2`) ); Query OK, 0 rows affected (0.011 sec)

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

  • InnoDB
mysql> select version(); +---------------------------------------------+ | version() | +---------------------------------------------+ | 10.5.22-MariaDB-1:10.5.22+maria~ubu2004-log | +---------------------------------------------+

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

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

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

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

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

dameo

2023/11/07 08:55

mariadbはよくわかりませんが、mysqlのinnodbだと8.0.30から非表示の主キーが生成されるようですよ。 https://dev.mysql.com/doc/refman/8.0/en/create-table-gipks.html 内部的にはもっと前かもしれませんが、気にしたことがなかったです。主キーがないテーブルなんていくらでもあるので。またクラスタ化インデックスなら構造上主キー相当は必ずあると思います。
guest

回答1

0

自己解決

以下の「3」があるので、テーブル作成成功は正常な動作でした。

公式ドキュメントに答えが書かれていました。
簡単にまとめました。

  1. Primary Keyが明示的に指定された場合は、Primary Keyを使用する
  2. 1が無い場合、NOT NULL かつ UNIQUE INDEXを探して出して利用する
  3. 2が無い場合、内部的にIDを自動生成する

https://dev.mysql.com/doc/refman/8.0/ja/innodb-index-types.html

投稿2023/11/07 08:47

編集2023/11/07 08:49
vj2a6wk5

総合スコア5

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

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

dameo

2023/11/07 09:12

一応mariadbでも相当の記述があることを確認しました。 https://mariadb.com/kb/en/getting-started-with-indexes/ > In InnoDB tables, all indexes contain the primary key as a suffix. > Thus, when using this storage engine, keeping the primary key as small as possible is particularly important. > If a primary key does not exist and there are no UNIQUE indexes, > InnoDB creates a 6-bytes clustered index which is invisible to the user.
vj2a6wk5

2023/11/07 09:19

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問