1

user_id2 つの主キー ( , ) を持つテーブルがあります。テーブルにこれをpost_id含む行がない場合にのみ行を挿入 し、このキーの以前のデータが存在する場合、その行のみが新しいデータで更新されます。このクエリを作成しました。user idpost id

INSERT INTO trust_list(`user_id`,`post_id`,`post_per`,`comment_per`,`cat_per`)
VALUES (7,1,'000','000','000') 
ON DUPLICATE KEY UPDATE `post_per`='000',`comment_per`='000',`cat_per`='000' 

たとえば、次の行がテーブルに存在する場合:

  • ユーザーID:5
  • post_id:1
  • post_per:001
  • comment_per:111
  • cat_per:101

次に、上記のクエリを実行すると、mysql はこの行を更新しますが、post_idこの行が「1」であるという理由だけで、mysql はこの行を更新すべきではありません。何が問題なのかわかりません。

DESC trust_list

上記のクエリの結果は次のとおりです。

Field       Type        Null    Key     Default     Extra
user_id     int(11)    NO       PRI     NULL    
post_id     int(4)     NO       PRI     NULL    
post_per    tinytext   YES              NULL    
comment_per tinytext   YES              NULL    
cat_per     tinytext   YES              NULL    

=================

すべての友人に感謝しますテーブルを削除して再度作成することにしたとき、このテーブルからエクスポートを取得して.sqlファイルを確認すると、次のように表示されます。

CREATE TABLE IF NOT EXISTS `trust_list` (
  `user_id` int(11) NOT NULL,
  `post_id` int(11) NOT NULL,
  `post_per` tinytext COLLATE utf8_estonian_ci ,
  `comment_per` tinytext COLLATE utf8_estonian_ci ,
  `cat_per` tinytext COLLATE utf8_estonian_ci ,
  PRIMARY KEY (`idea_id`,`user_id`),
  UNIQUE KEY `idea_id` (`idea_id`)
) 

どうやら、問題は UNIQUE KEY にあるようです。ファイルから削除し、テーブルを削除してからtrust_list.sql ファイルをインポートします。これで問題が解決しました。ありがとうございました

4

2 に答える 2

2

あなたの問題は、主キーの理解だと思います。テーブルに主キーを 2 つ持つことはできません。主キーは 1 つだけです。おそらく、2 つの列で構成される主キーです。その場合、両方の列が一致する場合にのみキー違反が発生します。

解決:

両方の列に一意のインデックスを導入します。または、より良い方法として、主キーを 2 つの列のうちの 1 つだけに変更し、もう一方の列に一意のインデックスを設定します。

peterem のおかげで、ここに私のソリューションのsqlfiddleがあります。

于 2013-05-05T16:29:27.017 に答える
2

テーブル スキーマに問題があります。

スキーマが次のように定義されていると仮定します

CREATE TABLE trust_list(
  `user_id` int,
  `post_id` int,
  `post_per` varchar(12),
  `comment_per` varchar(12),
  `cat_per`varchar(12),
PRIMARY KEY(`user_id`, `post_id`)
);

これは、ステートメントが問題なく機能することを示すSQLFiddleINSERTです。

CREATE TABLE問題を見つけるのに役立つようにステートメントを表示するか、表示されているように PK を変更することを検討してください。

于 2013-05-05T16:35:24.390 に答える