source

프라이머리 키 없이 테이블을 만들고 프라이머리 키를 추가할 경우 프라이머리 키는 클러스터된 인덱스입니까?

manycodes 2023. 1. 15. 17:18
반응형

프라이머리 키 없이 테이블을 만들고 프라이머리 키를 추가할 경우 프라이머리 키는 클러스터된 인덱스입니까?

인덱스 시작: 기본 키에서 다음과 같이 표시됩니다.

InnoDB 테이블에서 모든 인덱스는 접미사로 기본 키를 포함합니다.따라서 이 스토리지 엔진을 사용할 때는 기본 키를 가능한 한 작게 유지하는 것이 특히 중요합니다.기본 키가 존재하지 않고 고유 인덱스가 없는 경우 InnoDB는 사용자에게 보이지 않는 6바이트 클러스터 인덱스를 생성합니다.

기본 키가 없으면 숨겨진 클러스터 인덱스로 테이블을 만듭니다.그리고 나중에 같은 섹션에서 몇 개의 단락에서 다음과 같이 설명합니다.

CREATE INDEX 명령을 사용하여 기본 키를 생성할 수 없습니다.테이블이 이미 작성된 후에 추가할 경우 ALTER TABLE을 사용합니다.다음은 예를 제시하겠습니다.

그러나 새 기본 키가 클러스터된 인덱스가 될지는 알 수 없습니다.

또한 ALTER TABLE: ADD Primary Key는 다음과 같이만 표시됩니다.

PRIMAY KEY 인덱스의 경우 인덱스의 이름을 지정할 수 있지만 자동으로 무시되고 인덱스 이름은 항상 PRIMAY입니다.

클러스터된 인덱스에 대해서는 코멘트를 하지 않습니다.

혼란스러움으로 인해 다음과 같은 질문이 발생합니다.

  1. 나중에 프라이머리 키를 추가하면 프라이머리 키가 클러스터화됩니까?
  2. 이 경우 스토리지 레이아웃은 어떻게 됩니까?모든 데이터를 새 클러스터된 인덱스에 복사한 다음 이전에 숨겨진 클러스터된 인덱스를 삭제해야 합니까?
  3. 프라이머리 키는 항상 클러스터화되어 있습니까?

최소 재생 예:

create database test
use test
create table test_table ( id bigint(20) NULL );

describe test_table;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | bigint(20) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
1 row in set (0.003 sec)

show index from test_table;
Empty set (0.000 sec)


alter table test_table add primary key(id);
Query OK, 0 rows affected (0.067 sec)
Records: 0  Duplicates: 0  Warnings: 0

describe test_table;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | bigint(20) | NO   | PRI | NULL    |       |
+-------+------------+------+-----+---------+-------+
1 row in set (0.007 sec)

show index from test_table;
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table      | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| test_table |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.001 sec)

테이블에 기본 키가 있는 경우 항상 클러스터된 인덱스가 됩니다(InnoDB 엔진에 있다고 가정).

테이블을 변경하여 기본 키를 추가하면 해당 키가 클러스터된 인덱스가 됩니다.

기본 키를 추가하거나 변경하면 레이아웃이 완전히 변경되므로 테이블을 재구성해야 합니다.

언급URL : https://stackoverflow.com/questions/71846916/if-i-create-a-table-without-a-primary-key-then-add-a-primary-key-is-the-primary

반응형