중복 항목이 없는데도 MySQL 중복 항목 오류
MySQL 5.1.56, MyISAM을 사용하고 있습니다.내 테이블은 다음과 같습니다.
CREATE TABLE IF NOT EXISTS `my_table` (
`number` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`money` int(11) NOT NULL,
PRIMARY KEY (`number`,`name`)
) ENGINE=MyISAM;
여기에는 다음 두 개의 행이 포함됩니다.
INSERT INTO `my_table` (`number`, `name`, `money`) VALUES
(1, 'S. Name', 150), (2, 'Another Name', 284);
이제 다른 행을 삽입하려고 합니다.
INSERT INTO `my_table` (`number`, `name`, `money`) VALUES
(2, 'S. Name', 240);
MySQL은 다음과 같이 말하면서도 이를 삽입하지 않을 뿐입니다.
#1062 - Duplicate entry '2-S. Name' for key 'PRIMARY'
정말 이해가 안 돼요.기본 키는 처음 두 열(둘 다)에 있어서 삽입하려는 행에 고유한 기본 키가 있지 않습니까?
저는 테이블을 수리하려고 했고, 테이블을 최적화하려고 했지만, 아무 소용이 없었습니다.또한 My ISAM에서 InnoDB로 변경이 불가하다는 점 참고 부탁드립니다.
제가 뭔가를 놓치고 있는 건가요, 아니면 MySQL이나 MyISAM의 버그인가요?감사해요.
제가 생각하기에 문제가 있다고 생각하는 부분을 요약하고 지적하는 것입니다. (그렇지 않아야 함에도 불구하고)테이블에는 두 개의 열에 기본 키가 있습니다.이 두 열에 값의 새로운 조합이 있는 행을 삽입하려고 하는데 1열의 값이 이미 일부 행에 있고 2열의 값이 이미 다른 행에 있습니다.하지만 그것들은 어디에도 합쳐져 있지 않기 때문에, 저는 이것이 작동되어야 한다고 생각하고 그것이 작동하지 않는 것을 보고 매우 혼란스럽습니다.
코드와 스키마는 정상입니다.이전 버전의 테이블을 사용해 보셨을 겁니다.
http://sqlfiddle.com/ #!2/9dc64/1/0
당신의 테이블에는 유니크함도 없어서 그 테이블에서는 에러가 발생할 수 없습니다.
해당 테이블에서 데이터를 백업하고 삭제한 후 다시 생성합니다.
어쩌면 당신은 그걸 실행하려고 했을지도 모릅니다.CREATE TABLE IF NOT EXIST
. (으)로 인해 하지 않았습니다. 이전 버전이 있습니다. 그러나 다음과 같은 이유로 오류가 발생하지 않았습니다.IF NOT EXIST
.
SQL을 실행하면 현재 테이블 구조를 볼 수 있습니다.
DESCRIBE my_table;
편집 - 나중에 추가:
실행해 보십시오.
DROP TABLE `my_table`; --make backup - it deletes table
CREATE TABLE `my_table` (
`number` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`money` int(11) NOT NULL,
PRIMARY KEY (`number`,`name`),
UNIQUE (`number`, `name`) --added unique on 2 rows
) ENGINE=MyISAM;
이 경우에는 문제가 되지 않았지만 복합 기본 키를 만들 때 "중복 입력"이라는 유사한 문제가 발생했습니다.
ALTER TABLE table ADD PRIMARY KEY(fieldA,fieldB);
오류는 다음과 같습니다.
#1062 Duplicate entry 'valueA-valueB' for key 'PRIMARY'
그래서 검색했습니다.
select * from table where fieldA='valueA' and fieldB='valueB'
그리고 출력은 단 1행으로 중복되지 않았습니다!
시간이 흐른 후 이 필드에 NULL 값이 있으면 이러한 오류가 발생한다는 것을 알게 되었습니다.결국 그 오류 메시지는 나를 오도하는 것이었습니다.
문제가 제에는 , 와 같은 .utf8_general_ci
.
그래서 대/소문자 구분 비교에서는 다르지만 대/소문자 구분 비교에서는 동일한 두 문자열을 삽입하려고 하면 MySQL에서 오류가 발생하여 대/소문자 구분 검색을 사용했기 때문에 문제가 무엇인지 이해할 수 없었습니다.
를 들어 입니다를 했습니다. 예를 들어 제가 사용했습니다.utf8_bin
다).utf8_general_cs
적절한 것이어야 함).
이것이 OP 이외에 다른 사람에게 도움이 되는 경우에, 저는 InnoDB를 사용하는 것과 비슷한 문제를 겪었습니다.
저에게 실제로 일어나고 있던 일은 외국인 키 제약 실패였습니다.존재하지 않는 외국 키를 참조하고 있었습니다.
즉, 오류가 완전히 사라졌다는 것입니다.프라이머리 키는 문제가 없었고, 외국 키를 먼저 삽입하면 문제가 해결되었습니다.MySQL이 왜 갑자기 이런 문제를 일으켰는지 모르겠습니다.
DOC https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-limitations.html 에 따르면 일반적인 경우는 적지만 이 점을 명심해야 합니다.
온라인 ALTER TABLE 작업을 실행할 때 ALTER TABLE 작업을 실행하는 스레드는 다른 연결 스레드에서 동일한 테이블에서 동시에 실행된 DML 작업의 "온라인 로그"를 적용합니다.DML 작업을 적용하면 중복 키 입력 오류가 발생할 수 있습니다(ERROR 1062 (23000):중복 항목), 중복 항목이 일시적인 것일 뿐이며 "온라인 로그"의 나중 항목에 의해 반환되는 경우에도 중복 항목이 포함됩니다.이는 InnoDB에서 거래 시 제약 조건이 반드시 유지되어야 하는 외국 키 제약 조건 검사의 개념과 유사합니다.
제 한 인데, 인데입니다.varchar(50)
되었습니다가 버전에서 되었습니다.varchar(70)
해당 열(및 해당 필드의 항목 중 50자 이상을 사용하는 항목)에 대해 설명합니다.
가져오기 중에 일부 키가 잘려서 잘린 버전이 더 이상 고유하지 않습니다.그것을 알아내는 데 시간이 좀 걸렸는데, 저는 "하지만 이 중복된 키는 존재하지도 않아요!"라고 생각했습니다.
자동 증분으로 시도:
CREATE TABLE IF NOT EXISTS `my_table` (
`number` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`money` int(11) NOT NULL,
PRIMARY KEY (`number`,`name`)
) ENGINE=MyISAM;
이 데모에서는 코드가 잘 작동합니다.
http://sqlfiddle.com/ #!8/87e10/1/0
두 번째 쿼리(삽입...)를 두 번 수행하는 것 같습니다. 시도해 보십시오.
select * from my_table
새 행을 삽입하기 전에 데이터가 이미 존재하는지 여부를 알 수 있습니다.
방금 시도했는데 데이터가 있고 테이블을 다시 만들어도 안된다면 InnoDB로 수정해서 다시 시도하면 문제가 해결됩니다.
다른 사람이 내 문제로 이 스레드를 찾을 경우 -- MySQL에서 "정수" 열 유형을 사용하고 있었습니다.삽입하려는 행에 정수에서 허용하는 값보다 큰 기본 키가 있습니다."비긴트"로 전환하면 문제가 해결되었습니다.
당신의 코드에 의하면 당신의 "숫자"와 "이름"이 주요 키이고 당신은 S를 삽입하고 있습니다.충돌이 발생하도록 양쪽 행에 NAME을 입력합니다.완전한 데이터에 접근하기 위해 기본 키를 사용하고 있습니다.여기서는 기본 키 'name'을 사용하여 데이터에 액세스할 수 없습니다.
저는 초보자이고 아마 오류일거라고 생각합니다.
제 경우에는 그 오류가 매우 오해의 소지가 있었습니다.문제는 PHPmyAdmin이 "ALTER 무시 테이블"이 아닌 "고유의 만들기" 버튼을 클릭할 때 "ALTER TABLE"을 사용하기 때문에 다음과 같이 수동으로 수행해야 했습니다.
ALTER TABLE mytbl ADD UNIQUE (columnName);
이 문제는 열을 추가하거나 기존 열을 기본 키로 사용할 때 종종 발생합니다.실제로 생성되지 않은 기본 키가 존재하거나 테이블이 손상되어 생성되지 않습니다.
실제로 오류는 보류 중인 키 값이 비어 있다는 것을 의미합니다.
이 방법은 열을 고유한 값으로 채운 다음 기본 키를 다시 만드는 것입니다.공백, null 또는 중복된 값을 사용할 수 없습니다. 그렇지 않으면 잘못된 오류가 나타납니다.
저에게는 테이블에 누프만으로도 충분했습니다(이미 InnoDB였습니다).
ALTER TABLE $tbl ENGINE=InnoDB;
tl;dr: 내 보기에는 테이블이 비어 있지만 기존 행이 제외된 것으로 표시됩니다.
저도 같은 문제가 있었는데 제가 예전에 쓰던 테스트 행을 그대로 삽입해서 문제가 생겼습니다.테이블이 비어 있는지 확인할 때 다른 테넌트를 제외한 보기를 사용하여 검색이 비어 있습니다.실제 표를 확인해보니 이전 기록들이 그대로 남아 있었습니다.
기존 기록을 삭제하고 나면 인서트가 작동했습니다.좌절의 반나절만이 이 사람한테...
했습니다인 할 때 이했습니다.ADD PRIMARY KEY (column1, column2, ...)
해당 행에 있는 모든 열의 값이 중복되어서는 안 됩니다.
:래를 .ADD PRIMARY KEY (name, country, number)
이름. | 나라 | 번호 |
---|---|---|
콜린을 하다 | 우크 | 5 |
콜린을 하다 | 우크 | 5 |
합니다를 .#1062 - Duplicate entry 'collin-UK-5' for key 'PRIMARY'
입니다가 입니다.
따라서 이런 형식의 오류가 나타나면 복합 기본 키를 결합할 열에 중복이 없는지 확인하기만 하면 됩니다.
이 오류가 발생하는 또 다른 이유는 다른 관련 테이블에 동일한 제한이 있고 관련 테이블의 Keyname의 이름이 완전히 같기 때문입니다.이런 일이 한 번 있었는데 확인하기가 꽤 어려웠습니다.
즉, 동일한 제한과 동일한 키 이름을 가진 다른 테이블("관련" 테이블)에 데이터를 삽입하는 트리거가 있는 경우 MySQL에는 오류를 던지는 테이블의 이름이 포함되지 않고 키 이름만 포함됩니다.
당신의 실수를 보면서#1062 - Duplicate entry '2-S. Name' for key 'PRIMARY'
숫자 필드에 기본 키를 사용한다고 해서 숫자 필드에 중복된 오류가 표시됩니다.따라서 이 기본 키를 제거한 다음 중복 키를 삽입합니다.
언급URL : https://stackoverflow.com/questions/13132535/mysql-duplicate-entry-error-even-though-there-is-no-duplicate-entry
'it-source' 카테고리의 다른 글
자바스크립트 기능에서 php를 어떻게 사용할 수 있습니까? (0) | 2023.09.28 |
---|---|
ORACLE TRIM 및 RTRIM: TRAILING(트레일링…)을 두 개 이상의 문자로 선택하시겠습니까? (0) | 2023.09.28 |
SQL 데이터베이스에서 동일한 이름을 관리하는 방법은 무엇입니까? (0) | 2023.09.28 |
Maria DB에 저장된 프로시저에서 여러 행을 반환하려면 어떻게 해야 합니까? (0) | 2023.09.28 |
프로젝트의 여러 대상 및 플랫폼에 대한 Swift Package 소비? (0) | 2023.09.23 |