2013-05-05 53 views
1

我有2个主键(user_idpost_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' 

例如,如果该行存在于表中:

  • USER_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  

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

感谢我所有的朋友 当我决定删除表,并再次ceate它,我得到从该表 出口和审查.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`) 
) 

显然,问题是唯一键,我从文件中删除,然后删除trust_list表,然后导入.sql文件 所以用这个,我的问题解决了 再次感谢

+0

您可以发布此语句的结果:'DESC trust_list'。 – 2013-05-05 16:24:13

+0

是的,当然,我把它添加到文章 – 2013-05-05 18:58:44

回答

2

我觉得你的问题是你的了解主键。表中不能有两个主键,只有一个。你可能是一个由两列组成的主键。在这种情况下,只有两列匹配时才会发生重大违规行为。

解决方案:

为两列引入唯一索引。或者 - 更好 - 将主键更改为两列中的一列,并将另一列设置为唯一索引。

感谢peterem这里是我的解决方案sqlfiddle

+0

我认为这是相反的。他想允许插入,但是他得到了一个重复的键,因为他自己错误地声明'post_id'是一个唯一的键。 – Barmar 2013-05-05 16:37:16

+0

可能。在这种情况下,peterm的答案将有助于OP – luksch 2013-05-05 16:42:14

+0

我想要主键,意味着user_id和post_id一起成为Perimary键 – 2013-05-05 18:18:10

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。

+0

谢谢,我第一次ceate这张表时,'user_id'设置为perimary键,但是然后我执行这个查询:ALTER TABLE trust_list DROP PRIMARY KEY,ADD PRIMARY KEY(user_id,post_id); – 2013-05-05 18:13:56

+0

我添加了表格描述,现在我想知道到底是什么问题,你能帮我找到问题吗? – 2013-05-06 03:05:18

+0

@ user2273788您不必对发布的表模式有任何问题。我用你的确切表格定义为你创建了** [sqlfidle](http://sqlfiddle.com/#!2/62a02/1)**。它工作得很好。 – peterm 2013-05-06 03:21:18