source

MySQL 오류: 키 길이가 없는 키 지정

gigabyte 2022. 9. 5. 23:08
반응형

MySQL 오류: 키 길이가 없는 키 지정

프라이머리 키가 varchar(255)인 테이블이 있습니다.255자로 부족한 경우도 있습니다.필드를 텍스트로 변경하려고 했는데 다음 오류가 나타납니다.

BLOB/TEXT column 'message_id' used in key specification without a key length

어떻게 하면 고칠 수 있을까요?

edit: 이 테이블에는 여러 컬럼이 있는 복합 프라이머리 키도 있습니다.

오류는 "MySQL" BLOB의 첫 수 때문에 합니다.TEXT그래서 는 주로 필드/컬럼 있을 발생합니다.TEXT BLOB BLOB에 것TEXT ★★★★★★★★★★★★★★★★★」BLOBTINYBLOB,MEDIUMBLOB,LONGBLOB,TINYTEXT,MEDIUMTEXT , , , , 입니다.LONGTEXT프라이머리 키 또는 인덱스를 작성하려고 합니다. ★★★★★BLOB ★★★★★★★★★★★★★★★★★」TEXT길이 값이 없으면 MySQL은 열이 가변적이고 동적 크기이기 때문에 일의성을 보장할 수 없습니다.'어디서'를 쓸 때BLOB ★★★★★★★★★★★★★★★★★」TEXTMySQL이 키 길이를 결정할 수 있도록 N 값을 제공해야 합니다.은 "MySQL"에 키 하지 않습니다.TEXT ★★★★★★★★★★★★★★★★★」BLOBTEXT(88)전혀 효과가 없어요.

하려고 할 됩니다.non-TEXT ★★★★★★★★★★★★★★★★★」non-BLOB「」의 .VARCHAR ★★★★★★★★★★★★★★★★★」ENUMTEXT ★★★★★★★★★★★★★★★★★」BLOB 고유 제약조건 index.type(은 고유 또는 index.type)으로.테이블 SQL을 변경합니다.

은 을(를) 삭제하는 것입니다.TEXT ★★★★★★★★★★★★★★★★★」BLOB다른 필드를 기본 키로 설정하거나 인덱스 또는 다른 필드를 기본 키로 설정합니다. 수 없고 , 하고 싶으면요.TEXT ★★★★★★★★★★★★★★★★★」BLOB '나'를 .VARCHAR타이핑하여 길이를 제한합니다." " " 입니다.VARCHAR 그 「255」는 「255」, 「255」는 「255」는 「255」, 「255」는 「255」로 되어 있습니다.VARCHAR(200)200달러

TEXT ★★★★★★★★★★★★★★★★★」BLOB1170년를 들어, 을 지정했을 때 합니다.VARCHAR열이 기본 키로 지정되었지만 길이 또는 문자 크기를 잘못 설정했습니다. VARCHAR할 수 에 256자까지 할 수 .VARCHAR(512)이 MySQL을 자동 합니다.VARCHAR(512) a까지SMALLTEXT 컬럼이 키 되는 경우 키 한다.datatype: " " " " " " " " " " " " " " 1170 " " "를 256보다 작은 크기로 합니다.VARCHARsyslog.syslog.syslog.

레퍼런스:MySQL 오류 1170(42000): 키 길이가 없는 키 사양에서 사용되는 BLOB/TEXT 열

하다, 하다, 하다, 하다, 하다, 하다의 .TEXT이치노

InnoDB의 제한이 .768인덱스 키당 바이트 수를 초과하면 인덱스를 생성할 수 없습니다.

이 조작은 정상적으로 동작합니다.

CREATE TABLE t_length (
      mydata TEXT NOT NULL,
      KEY ix_length_mydata (mydata(255)))
    ENGINE=InnoDB;

키 크기의 최대값은 열 문자 집합에 따라 달라집니다.입니다.767다음과 같은 단일 바이트 문자 집합의 문자LATIN1 ''만''255「 」의 문자UTF8 )MySQL는 " " 을 사용합니다.BMP 필요한 입니다.3자당바바바)))))

가 ""로 할 PRIMARY KEY하다, 계산하다.SHA1 ★★★★★★★★★★★★★★★★★」MD5PRIMARY KEY.

다음과 같이 alter table 요청에서 키 길이를 지정할 수 있습니다.

alter table authors ADD UNIQUE(name_first(20), name_second(20));

에서는 MySQL의 수 .BLOB,TEXT 긴 and andVARCHAR컬럼에 포함된 데이터가 클 수 있고 암시적으로 DB 인덱스가 클 수 있으므로 인덱스의 이점이 없습니다.

MySQL에서는 인덱스를 작성할 첫 번째 N개의 문자를 정의해야 합니다.여기서 요령은 N개의 숫자를 선택하는 것입니다.N은 선택성이 뛰어나지만 공간을 절약할 수 있을 정도로 짧습니다.접두사는 인덱스가 전체 열을 인덱싱했을 때와 거의 같은 수준으로 유용할 수 있도록 충분히 길어야 합니다.

더 나아가기 전에 몇 가지 중요한 용어를 정의하겠습니다.인덱스 선택성은 총 고유 인덱스 값과 총 행 수의 비율입니다.테스트 테이블의 예를 다음에 나타냅니다.

+-----+-----------+
| id  | value     |
+-----+-----------+
| 1   | abc       |
| 2   | abd       |
| 3   | adg       |
+-----+-----------+

첫 번째 문자(N=1)만 인덱싱하면 인덱스 테이블은 다음과 같습니다.

+---------------+-----------+
| indexedValue  | rows      |
+---------------+-----------+
| a             | 1,2,3     |
+---------------+-----------+

이 경우 지수 선택성은 IS=1/3 = 0.33과 같습니다.

이제 인덱싱된 문자 수를 2개(N=2)로 늘리면 어떻게 되는지 살펴보겠습니다.

+---------------+-----------+
| indexedValue  | rows      |
+---------------+-----------+
| ab             | 1,2      |
| ad             | 3        |
+---------------+-----------+

이 시나리오에서는 IS=2/3=0.66으로 지수 선택성을 높였지만 지수 크기 또한 증가하였다.요령은 인덱스 선택성을 극대화하는 최소 수 N을 찾는 것입니다.

데이터베이스 테이블에 대해 계산할 수 있는 방법은 두 가지가 있습니다.데이터베이스 덤프에서 데모를 해보겠습니다.

테이블 직원last_name 열을 인덱스에 추가하고 인덱스의 선택성을 최적으로 하는 최소 숫자 N을 정의한다고 가정합니다.

먼저 가장 빈번한 성을 확인합니다.

select count(*) as cnt, last_name 
from employees 
group by employees.last_name 
order by cnt

+-----+-------------+
| cnt | last_name   |
+-----+-------------+
| 226 | Baba        |
| 223 | Coorg       |
| 223 | Gelosh      |
| 222 | Farris      |
| 222 | Sudbeck     |
| 221 | Adachi      |
| 220 | Osgood      |
| 218 | Neiman      |
| 218 | Mandell     |
| 218 | Masada      |
| 217 | Boudaillier |
| 217 | Wendorf     |
| 216 | Pettis      |
| 216 | Solares     |
| 216 | Mahnke      |
+-----+-------------+
15 rows in set (0.64 sec)

보시다시피, 바바가 가장 많은 성입니다.다음으로 가장 자주 발생하는 last_name 프리픽스를 5글자의 프리픽스로부터 검색합니다.

+-----+--------+
| cnt | prefix |
+-----+--------+
| 794 | Schaa  |
| 758 | Mande  |
| 711 | Schwa  |
| 562 | Angel  |
| 561 | Gecse  |
| 555 | Delgr  |
| 550 | Berna  |
| 547 | Peter  |
| 543 | Cappe  |
| 539 | Stran  |
| 534 | Canna  |
| 485 | Georg  |
| 417 | Neima  |
| 398 | Petti  |
| 398 | Duclo  |
+-----+--------+
15 rows in set (0.55 sec)

모든 프리픽스에는 훨씬 더 많은 항목이 있습니다.즉, 값이 앞의 예와 거의 같아질 때까지 번호N을 늘려야 합니다.

다음은 N=9에 대한 결과입니다.

select count(*) as cnt, left(last_name,9) as prefix 
from employees 
group by prefix 
order by cnt desc 
limit 0,15;

+-----+-----------+
| cnt | prefix    |
+-----+-----------+
| 336 | Schwartzb |
| 226 | Baba      |
| 223 | Coorg     |
| 223 | Gelosh    |
| 222 | Sudbeck   |
| 222 | Farris    |
| 221 | Adachi    |
| 220 | Osgood    |
| 218 | Mandell   |
| 218 | Neiman    |
| 218 | Masada    |
| 217 | Wendorf   |
| 217 | Boudailli |
| 216 | Cummings  |
| 216 | Pettis    |
+-----+-----------+

다음은 N=10에 대한 결과입니다.

+-----+------------+
| cnt | prefix     |
+-----+------------+
| 226 | Baba       |
| 223 | Coorg      |
| 223 | Gelosh     |
| 222 | Sudbeck    |
| 222 | Farris     |
| 221 | Adachi     |
| 220 | Osgood     |
| 218 | Mandell    |
| 218 | Neiman     |
| 218 | Masada     |
| 217 | Wendorf    |
| 217 | Boudaillie |
| 216 | Cummings   |
| 216 | Pettis     |
| 216 | Solares    |
+-----+------------+
15 rows in set (0.56 sec)

이것은 매우 좋은 결과입니다., 열에서 수 .last_name열 살 때[ ] " " " "last_name되어 있습니다.VARCHAR(16)엔트리에 6바이트(또는 성에 UTF8 문자가 있는 경우는 그 이상)가 절약되어 있는 것을 의미합니다.이 테이블에는 1637개의 개별 값에 6바이트를 곱한 값이 약 9KB로 되어 있습니다.테이블에 수백만 개의 행이 포함되어 있는 경우 이 수치가 어떻게 증가할지 상상해 보십시오.

MySQL의 내 게시물 접두사 인덱스에서 N의 를 계산하는 다른 방법을 읽을 수 있습니다.

텍스트 유형 열이 있는 테이블에 인덱스를 추가할 때 이 오류가 발생했습니다.각 텍스트 유형에 사용할 크기를 선언해야 합니다.

사이즈의 양을 괄호 안에 넣습니다( ).

너무 많은 바이트가 사용되는 경우 varchar의 크기를 대괄호로 선언하여 인덱싱에 사용되는 양을 줄일 수 있습니다.이는 이미 varchar(1000)와 같은 유형의 크기를 선언한 경우에도 마찬가지입니다.다른 사람이 말한 것처럼 새 테이블을 만들 필요는 없습니다.

인덱스 추가

alter table test add index index_name(col1(255),col2(255));

고유 인덱스 추가

alter table test add unique index_name(col1(255),col2(255));
alter table authors ADD UNIQUE(name_first(767), name_second(767));

메모: 767은 MySQL이 BLOB/텍스트 인덱스를 처리할 때 열을 인덱싱할 수 있는 최대 글자 수입니다.

참고 자료 : http://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html

이 문제를 해결하는 또 하나의 뛰어난 방법은 고유한 제약 없이 TEXT 필드를 만들고 TEXT 필드의 다이제스트(MD5, SHA1)를 포함하는 형제 VARCHAR 필드를 추가하는 것입니다.TEXT 필드를 삽입하거나 업데이트할 때 TEXT 필드 전체에 대한 다이제스트를 계산하고 저장하면 TEXT 필드 전체(일부 선행 부분이 아닌)에 대한 고유한 제약 조건이 있어 빠르게 검색할 수 있습니다.

기본 키로 긴 값을 사용하지 마십시오.그러면 성능이 저하됩니다.mysql 매뉴얼의 섹션 13.6.13 "InnoDB 성능 조정 및 문제 해결"을 참조하십시오.

대신 surgary int 키를 primary(auto_increment)로 하고 loong 키를 secondary UNIQE로 합니다.

꽤 늦은 건 알지만, 그걸 없애버리면Unique Key이치노는 안 TEXT ★★★★★★★★★★★★★★★★★」LONGTEXT열을 PK로 지정합니다.단, 는 그것을 일의로 하려고 했습니다.나는 그것을 얻었다.1170 errorUK에러도 삭제되었습니다.

왜 그런지 잘 모르겠어요.

다른 varChar(255) 열(기본값은 빈 문자열이 null이 아님)을 추가하여 255자가 부족할 때 오버플로를 유지하고 두 열을 모두 사용하도록 이 PK를 변경합니다.그러나 이것은 잘 설계된 데이터베이스 스키마처럼 들리지 않으며, 데이터 모델러에게 보다 정규화를 위해 리팩터링하기 위한 목적으로 데이터 모델러를 의뢰할 것을 권장합니다.

은 '의 것'에 .CREATE TABLE 제약 인 「이러다」, 「이러다」를 수 있습니다.UNIQUE ( problemtextfield(300) )후 " " " 를 합니다.key 300TEXT예를 들어 필드입니다. 첫 가 첫 번째가300「」의」problemtextfield TEXT필드는 고유해야 하며 그 이후의 모든 차이는 무시됩니다.

또한 이 필드에서 인덱스를 사용하려면 MyISAM 스토리지 엔진과 FULLTEXT 인덱스 유형을 사용해야 합니다.

'그' 입니다.이모티콘도 할 수 더 사용하지 ). utf8mb4는 utf8을 사용하지 않습니다. utf8은 utf8을 사용하지 .Incorrect string value: \xF0\x9F\x98\...utf8mb4와 VARCHAR(255)의 경우 데이터의 동일한 부분이 오프페이지에 저장되어 VARCHAR(255) 열의 인덱스를 작성할 수 없지만 VARCHAR(191)의 인덱스를 작성할 수 있기 때문에 일반적인 VARCHAR(25)가 아닌 VARCHAR(191)을 사용해야 합니다.그 이유는 ROW_FORMAT=LOSE 또는 ROW_FORMAT=LOSE의 최대 인덱스 열 크기가 767바이트이기 때문입니다.

새로운 행 형식의 경우 ROW_FORMAT=DYNAMIC 또는 ROW_FORMAT=COMPRESSED(새로운 파일 형식 innodb_file_format=Notherp)의 최대 인덱스 열 크기는 3072입니다.MySQL > = 5.6.3부터 사용할 수 있습니다(MySQL <= 5.7.6에서는 기본 비활성화, MySQL > = 5.7.7에서는 기본 활성화).따라서 이 경우 인덱스 컬럼에 utf8mb4(또는 오래된 utf8의 경우 VARCHAR(1024))를 사용할 수 있습니다.innodb_large_prefix 옵션은 MySQL 8에 내장되어 있기 때문에 5.7.7 이후 권장되지 않습니다(이 버전에서는 옵션이 제거되었습니다).

TEXT인 - 해야 합니다.
1: Query () 1: " "

ALTER TABLE table_name MODIFY COLUMN col_name datatype;
ALTER TABLE my_table MODIFY COLUMN my_col VARCHAR(255);

2: GUI © 2: GUI(MySQL 워크벤치)
1단계 - 텍스트 상자에 쓰기

2단계 - 데이터 유형 편집, 적용

당신이 말한 것과 같은 오류가 있는 것을 사용하곤 했습니다.

CREATE INDEX idx_col1 ON my_table (col1);

그리고 이걸 이걸로 바꿔서 해결했어요.

CREATE INDEX idx_col1 ON my_table (col1(255));

를 '보다 낫다'로 .varchar ★★★★★★★★★★★★★★★★★」integer인덱스에 사용합니다.

mysql mysql로 합니다.edit table->, 변화 칼럼 형식 -&gt에;컬럼 타입을로 변경합니다.varchar(45).

테이블을 버리고 스프링 프로젝트를 다시 실행합니다.그게 도움이 될 거야.foreignKey를 덮어쓸 수 있습니다.

이렇게 쓰세요.

@Id
@Column(name = "userEmailId", length=100)
private String userEmailId;

언급URL : https://stackoverflow.com/questions/1827063/mysql-error-key-specification-without-a-key-length

반응형