프라이머리 키 없이 테이블을 만들고 프라이머리 키를 추가할 경우 프라이머리 키는 클러스터된 인덱스입니까?
InnoDB 테이블에서 모든 인덱스는 접미사로 기본 키를 포함합니다.따라서 이 스토리지 엔진을 사용할 때는 기본 키를 가능한 한 작게 유지하는 것이 특히 중요합니다.기본 키가 존재하지 않고 고유 인덱스가 없는 경우 InnoDB는 사용자에게 보이지 않는 6바이트 클러스터 인덱스를 생성합니다.
기본 키가 없으면 숨겨진 클러스터 인덱스로 테이블을 만듭니다.그리고 나중에 같은 섹션에서 몇 개의 단락에서 다음과 같이 설명합니다.
CREATE INDEX 명령을 사용하여 기본 키를 생성할 수 없습니다.테이블이 이미 작성된 후에 추가할 경우 ALTER TABLE을 사용합니다.다음은 예를 제시하겠습니다.
그러나 새 기본 키가 클러스터된 인덱스가 될지는 알 수 없습니다.
또한 ALTER TABLE: ADD Primary Key는 다음과 같이만 표시됩니다.
PRIMAY KEY 인덱스의 경우 인덱스의 이름을 지정할 수 있지만 자동으로 무시되고 인덱스 이름은 항상 PRIMAY입니다.
클러스터된 인덱스에 대해서는 코멘트를 하지 않습니다.
혼란스러움으로 인해 다음과 같은 질문이 발생합니다.
- 나중에 프라이머리 키를 추가하면 프라이머리 키가 클러스터화됩니까?
- 이 경우 스토리지 레이아웃은 어떻게 됩니까?모든 데이터를 새 클러스터된 인덱스에 복사한 다음 이전에 숨겨진 클러스터된 인덱스를 삭제해야 합니까?
- 프라이머리 키는 항상 클러스터화되어 있습니까?
최소 재생 예:
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
'source' 카테고리의 다른 글
MySQL에서 utf8 깨진 문자 감지 (0) | 2023.01.19 |
---|---|
MySQL JOIN은 가장 최근의 행만 사용하시겠습니까? (0) | 2023.01.19 |
하위 쿼리에서 WHERE를 삭제할 수 없습니다. (0) | 2023.01.15 |
서버를 재부팅하지 않고 .env 변수 새로고침(Larabel 5, 공유 호스팅) (0) | 2023.01.15 |
피어에 의해 TCP 소켓이 정상적으로 닫힌 것을 I/O를 시도하지 않고 검출할 수 없는 이유는 무엇입니까? (0) | 2023.01.15 |