我有一张包含2个主键的表(user_id
,post_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'
例如,如果表中存在此行:
然后,当我执行上述查询时,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文件
所以有了这个,我的问题就解决了
再次感谢
答案 0 :(得分:2)
我认为您的问题是您对主键的理解。表中不能有两个主键,只有一个。您可能拥有的是由两列组成的主键。在这种情况下,只有两列匹配时才会出现密钥违规。
解决方案:
为两列引入唯一索引。或者 - 更好 - 将主键更改为两列中的一列,并将另一列设置为具有唯一索引。
感谢peterem,我的解决方案是sqlfiddle。
答案 1 :(得分: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。