33

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;

次の 2 行が含まれます。

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'

私は本当にそれを理解していません。主キーは最初の 2 つの列 (両方とも) にあるため、挿入しようとしている行には一意の主キーがありますね。

テーブルを修復しようとしましたが、テーブルを最適化しようとしましたが、すべて役に立ちませんでした。また、MyISAM から InnoDB に変更することはできません。

何か不足していますか、それとも MySQL または MyISAM のバグですか? ありがとう。

要約して、どこに問題があると思うかを指摘します (問題があるべきではありませんが): テーブルには 2 つの列に主キーがあります。これら 2 つの列に値の新しい組み合わせを含む行を挿入しようとしていますが、列 1 の値は既にいくつかの行にあり、列 2 の値はすでに別の行にあります。しかし、それらはどこにも結合されていないので、これはうまくいくと信じていますが、うまくいかないことに非常に混乱しています.

4

17 に答える 17

23

コードとスキーマは問題ありません。おそらく、以前のバージョンのテーブルを試しているでしょう。

http://sqlfiddle.com/#!2/9dc64/1/0

テーブルにはUNIQUEさえないため、そのテーブルではエラーは発生しません。

そのテーブルからデータをバックアップし、削除して再作成します。

多分あなたはそれを実行しようとしました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;
于 2012-10-30T04:30:38.867 に答える
15

この場合、これが問題ではないことはわかっていますが、複合主キーを作成するときに「重複エントリ」という同様の問題がありました。

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 値があると、これらのエラーが発生することがわかりました。結局、エラーメッセージは私を誤解させるようなものでした.

于 2015-09-03T20:32:48.063 に答える
1

私の場合、エラーは古いスキーマが原因で発生しました.1つの列はもともとvarchar(50)ありましたが、インポートしようとしていたダンプはvarchar(70)、その列にあるスキーマの変更されたバージョンから作成されました(および、より多くを使用しているそのフィールドのエントリのいくつか50 文字以上)。

インポート中にいくつかのキーが切り捨てられ、切り捨てられたバージョンは一意ではなくなりました。それを理解するのにしばらく時間がかかりました。

于 2016-07-06T08:33:38.227 に答える
0

他の誰かが私の問題でこのスレッドを見つけた場合-私はMySQLで「整数」列タイプを使用していました。挿入しようとしていた行には、整数で許可されている値よりも大きな値を持つ主キーがありました。「bigint」に切り替えると、問題が修正されました。

于 2016-07-19T00:13:23.157 に答える
0

試したところ、データがあり、テーブルの再作成が機能しない場合は、テーブルを InnoDB に変更して再試行するだけで問題が解決します

于 2016-06-19T07:14:47.493 に答える
0

自動インクリメントを試してください:

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;
于 2012-10-30T04:27:42.353 に答える
0

あなたのコードはこのデモでうまく機能します:

http://sqlfiddle.com/#!8/87e10/1/0

2番目のクエリ(挿入...)を2回実行していると思います。試す

select * from my_table

新しい行を挿入する前に、データが既に存在するかどうかがわかります。

于 2012-10-30T04:31:49.570 に答える
-2

エラーを見ると#1062 - Duplicate entry '2-S. Name' for key 'PRIMARY'、数値フィールドで主キーを使用しているため、数値フィールドで重複したエラーが表示されています。したがって、この主キーを削除してから、複製も挿入します。

于 2012-10-30T04:36:20.027 に答える