1

我有一个带有 2 个主键的表(user_idpost_id)我只想插入行,如果表没有这个行user id并且post 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
  • 评论员: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

我认为您的问题是您对主键的理解。表中不能有两个主键,只有一个。您拥有的可能是由两列组成的主键。在这种情况下,只有当两列都匹配时,才会出现密钥违规。

解决方案:

为两列引入唯一索引。或者 - 更好 - 将主键更改为仅两列之一,并将另一列设置为具有唯一索引。

感谢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`)
);

这是SQLFiddle,它表明您的INSERT语句可以正常工作。

考虑展示您的CREATE TABLE陈述以帮助您找到问题,或者只是如图所示更改PK。

于 2013-05-05T16:35:24.390 回答