MySQL에서 기본 키 제거


182

user_customers를 라이브 MySQL 데이터베이스의 권한에 매핑하는 다음 테이블 스키마가 있습니다.

mysql> describe user_customer_permission;
+------------------+---------+------+-----+---------+----------------+
| Field            | Type    | Null | Key | Default | Extra          |
+------------------+---------+------+-----+---------+----------------+
| id               | int(11) | NO   | PRI | NULL    | auto_increment |
| user_customer_id | int(11) | NO   | PRI | NULL    |                |
| permission_id    | int(11) | NO   | PRI | NULL    |                |
+------------------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

user_customer_id 및 permission_id의 기본 키를 제거하고 id의 기본 키를 유지하고 싶습니다.

명령을 실행할 때 :

alter table user_customer_permission drop primary key;

다음과 같은 오류가 발생합니다.

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

열의 기본 키를 어떻게 삭제할 수 있습니까?

답변:


286

인덱스가 없으면 자동 증분 열을 유지 관리하는 데 비용이 많이 들기 때문에 MySQL자동 증분 열이 인덱스의 가장 왼쪽 부분이되어야합니다.

키를 삭제하기 전에 자동 증가 속성을 제거해야합니다.

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL;
ALTER TABLE user_customer_permission DROP PRIMARY KEY;

PRIMARY KEY세 개의 열을 모두 포함하는 id고유 한 복합 재료가 있다는 점에 유의하십시오 .

이 고유하게 발생하는 경우, 당신은이 될 수 있습니다 PRIMARY KEYAUTO_INCREMENT다시 :

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;

그런 다음 id 열을 auto_increment 기본 키로 복원하지 않아도됩니까? alter user_customer_permission 기본 키 추가 (id); 테이블 변경 user_customer_permission 변경 ID id int (11) auto_increment;
markb

@markb: 기본 키를 복원하면 키로 되돌릴 수 있습니다 AUTO_INCREMENT.
Quassnoi

이것은 자동 증가 열이 PRIMARY KEY의 가장 왼쪽 부분임을 의미합니다. ?
Arup Rakshit

1
@ArupRakshit는 : dev.mysql.com/doc/refman/5.6/en/...는 용도에 AUTO_INCREMENTAN, 이노 테이블기구 AUTO_INCREMENTai_col이 인덱싱 된 상당 수행 할 수 있도록하는 인덱스의 일부로서 정의되어야 SELECT MAX(ai_col)조회 테이블에서 최대 열 값을 얻습니다. 일반적으로 이는 열을 일부 테이블 인덱스의 첫 번째 열로 만들어서 수행됩니다.
Quassnoi

PRIMARY가 정의되어 있지 않습니다. 왜 이런 일이 발생합니까? 나는 삭제하고 기본 키를 지정하지 않고 다시 ID 열을 추가했다 그래서
mrbengi을

121

한 줄:

ALTER TABLE  `user_customer_permission` DROP PRIMARY KEY , ADD PRIMARY KEY (  `id` )

또한 자동 증분을 잃지 않고 부작용을 일으킬 수있는 자동 증분을 다시 추가해야합니다.


5
필자는 필드 정의를 변경해야 할 필요성을 제거 할뿐만 아니라 변경되는 테이블의 fk 제약 조건을 통해 변경을 허용 하므로이 답변이 맨 위로 떠올라 야한다고 생각합니다. 정말 나에게 도움이되었습니다!
tomfumb

완벽 해! 나를 위해 자동 증가를 제거하기 위해 필드를 변경하더라도 기본 키를 삭제하지 못했습니다. 그러나이 솔루션은 잘 작동합니다!
user2447161

14

Quassnoi가 귀하의 직접적인 질문에 답변했다고 생각합니다. 참고 사항 : 어쩌면 이것은 어색한 표현 일 수도 있지만 각 필드에 하나씩 기본 키가 세 개 있다는 인상을 받고있는 것 같습니다. 그렇지 않다. 기본적으로 하나의 기본 키만 가질 수 있습니다. 여기에있는 것은 세 개의 필드로 구성된 기본 키입니다. 따라서 "열에 기본 키를 놓을 수 없습니다". 기본 키를 삭제하거나 기본 키를 삭제하지 않을 수 있습니다. 하나의 열만 포함하는 기본 키를 원하면 기존 기본 키를 3 열에 놓고 1 기본 열에 새 기본 키를 만들 수 있습니다.


11
ALTER TABLE `user_customer_permission` MODIFY `id` INT;
ALTER TABLE `user_customer_permission` DROP PRIMARY KEY;

7

복합 기본 키가있는 경우 다음과 같이하십시오. ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);


5

"기본 키를 복원하면 AUTO_INCREMENT로 되돌릴 수 있습니다."

ID 열의 "PK 속성 복원"및 "자동 증가 속성 복원"이 바람직한 지 여부는 의심의 여지가 없습니다.

테이블의 사전 정의에서 자동 증가가 있었으므로 ID 값을 제공하지 않고이 테이블에 삽입하는 일부 프로그램이있을 가능성이 높습니다 (ID 열이 자동 증가하므로).

자동 증분 속성을 복원하지 않으면 이러한 프로그램의 작동이 중단됩니다.


3

먼저 다음과 같이 auto_increment 필드를 제거하도록 열을 수정하십시오. alter table user_customer_permission modify column id int;

그런 다음 기본 키를 삭제하십시오. 테이블 user_customer_permission 삭제 기본 키를 변경하십시오.



1

나는 같은 문제가 있었고 내 테이블 내부의 일부 값 옆에있었습니다. 기본 키를

ALTER TABLEuser_customer_permission DROP PRIMARY KEY , ADD PRIMARY KEY (ID)

서버에서 문제가 계속되었습니다. 테이블 안에 새 필드를 만들었고 값을 새 필드로 옮기고 이전 필드를 삭제했는데 문제가 해결되었습니다 !!


1

열에 기본 키 를 추가 합니다.

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

테이블에서 기본 키 를 제거 합니다.

ALTER TABLE table_name DROP PRIMARY KEY;

0

먼저 데이터베이스를 백업하십시오. 그런 다음 테이블과 관련된 외래 키를 삭제하십시오. 외래 키 테이블을 자릅니다. 현재 테이블을 자릅니다. 필요한 기본 키를 제거하십시오. sqlyog 또는 워크 벤치 또는 heidisql, dbeaver 또는 phpmyadmin을 사용하십시오.


0

SQL 관리자에서 테이블을 찾아 마우스 오른쪽 단추로 클릭하고 디자인을 선택한 다음 작은 키 아이콘을 마우스 오른쪽 단추로 클릭하고 기본 키 제거를 선택하십시오.


이 게시물이 문제를 해결할 수 있지만 스크린 샷을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자들을위한 질문에 답변하고 있으며, 해당 사용자가보고있는 것과 동일한 UI를 모를 수도 있습니다.
해적 X
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.