微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何更新组合主键的一部分?

如何解决如何更新组合主键的一部分?

| 我有一个Drupal网站,该网站使用CCK内容字段来存储其大部分数据。 我想手动更改一些数据以指向不同的节点版本。
UPDATE content_field_table SET vid = \'1234\' WHERE nid = \'12\' AND vid = \'123\';
问题在于content_field_table具有一个复合主键
PRIMARY KEY (`vid`,`delta`)
因此,当我运行update语句时,出现以下错误错误代码:1062 密钥\'PRIMARY \'的重复条目\'52979-0 \' 如何根据需要更新vid?     

解决方法

主键必须是唯一的。因此,您不能将一个记录更改为与现有记录具有相同的PK 例如,如果您从下面的SQL获取任何记录,那么您想要执行的更新将无法完成。您需要先进行其他更改,或者删除记录或删除PK
SELECT SOURCE.delta,SOURCE.vid,TARGET.delta,TARGET.vid 
FROM   content_field_table SOURCE 
       INNER JOIN content_field_table TARGET 
         ON SOURCE.delta = TARGET.delta 
WHERE  SOURCE.vid = \'123\' 
       AND TARGET.vid = \'1234\' 
    ,不要更改您的主键。另外,尽可能不要使用复合主键。 MySQL(和其他数据库)将记录按PK顺序存储在页面中。 MySQL将为每个页面填充15/16的空间,然后再为新页面分配空间并在其中插入更多数据。 复合PK或更改PK的问题是碎片。我不是说磁盘碎片,而是索引碎片。随着PK的移动,必须在磁盘周围对数据进行混洗,以使其保持正确的顺序。根据数据集,MySQL可能必须移动许多物理行才能执行此操作。 更新您的PK同样如此。更改PK会更改磁盘上的顺序,并且需要移动许多行。如果可能,请使用自动递增的PK,或者不使用PK,并让MySQL为您创建内部PK。 您想要的是将新行追加到磁盘上最后一个空闲页面上,这既快速又便宜。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。