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
★★★★★★★★★★★★★★★★★」BLOB
TINYBLOB
,MEDIUMBLOB
,LONGBLOB
,TINYTEXT
,MEDIUMTEXT
, , , , 입니다.LONGTEXT
프라이머리 키 또는 인덱스를 작성하려고 합니다. ★★★★★BLOB
★★★★★★★★★★★★★★★★★」TEXT
길이 값이 없으면 MySQL은 열이 가변적이고 동적 크기이기 때문에 일의성을 보장할 수 없습니다.'어디서'를 쓸 때BLOB
★★★★★★★★★★★★★★★★★」TEXT
MySQL이 키 길이를 결정할 수 있도록 N 값을 제공해야 합니다.은 "MySQL"에 키 하지 않습니다.TEXT
★★★★★★★★★★★★★★★★★」BLOB
TEXT(88)
전혀 효과가 없어요.
하려고 할 됩니다.non-TEXT
★★★★★★★★★★★★★★★★★」non-BLOB
「」의 .VARCHAR
★★★★★★★★★★★★★★★★★」ENUM
TEXT
★★★★★★★★★★★★★★★★★」BLOB
고유 제약조건 index.type(은 고유 또는 index.type)으로.테이블 SQL을 변경합니다.
은 을(를) 삭제하는 것입니다.TEXT
★★★★★★★★★★★★★★★★★」BLOB
다른 필드를 기본 키로 설정하거나 인덱스 또는 다른 필드를 기본 키로 설정합니다. 수 없고 , 하고 싶으면요.TEXT
★★★★★★★★★★★★★★★★★」BLOB
'나'를 .VARCHAR
타이핑하여 길이를 제한합니다." " " 입니다.VARCHAR
그 「255」는 「255」, 「255」는 「255」는 「255」, 「255」는 「255」로 되어 있습니다.VARCHAR(200)
200달러
TEXT
★★★★★★★★★★★★★★★★★」BLOB
1170년를 들어, 을 지정했을 때 합니다.VARCHAR
열이 기본 키로 지정되었지만 길이 또는 문자 크기를 잘못 설정했습니다. VARCHAR
할 수 에 256자까지 할 수 .VARCHAR(512)
이 MySQL을 자동 합니다.VARCHAR(512)
a까지SMALLTEXT
컬럼이 키 되는 경우 키 한다.datatype: " " " " " " " " " " " " " " 1170 " " "를 256보다 작은 크기로 합니다.VARCHAR
syslog.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
★★★★★★★★★★★★★★★★★」MD5
PRIMARY 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 error
를 UK
에러도 삭제되었습니다.
왜 그런지 잘 모르겠어요.
다른 varChar(255) 열(기본값은 빈 문자열이 null이 아님)을 추가하여 255자가 부족할 때 오버플로를 유지하고 두 열을 모두 사용하도록 이 PK를 변경합니다.그러나 이것은 잘 설계된 데이터베이스 스키마처럼 들리지 않으며, 데이터 모델러에게 보다 정규화를 위해 리팩터링하기 위한 목적으로 데이터 모델러를 의뢰할 것을 권장합니다.
은 '의 것'에 .CREATE TABLE
제약 인 「이러다」, 「이러다」를 수 있습니다.UNIQUE ( problemtextfield(300) )
후 " " " 를 합니다.key
300
의 TEXT
예를 들어 필드입니다. 첫 가 첫 번째가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
->, 변화 칼럼 형식 ->에;컬럼 타입을로 변경합니다.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
'source' 카테고리의 다른 글
Java 제네릭 - 클래스 가져오기? (0) | 2022.09.05 |
---|---|
안드로이드로 파일 복사하는 방법? (0) | 2022.09.05 |
MariaDB는 여러 서브쿼리가 있는 여러 행에 "삽입" (0) | 2022.09.05 |
#1273 - 불분명한 대조: 'utf8mb4_unicode_ci' cPanel (0) | 2022.09.05 |
MySQL에서 재귀 SELECT 쿼리를 수행하는 방법 (0) | 2022.09.05 |