【问题标题】:Duplicate error on update mysql更新mysql时出现重复错误
【发布时间】:2018-07-11 09:57:47
【问题描述】:

我有一个包含多行的表。有些字段request_path 带有.html.html 之类的字符,而其他字段则带有不同的字符。我想删除所有.html.html 并使它们成为单个.html。我正在尝试以下命令 -

UPDATE url_rewrite 
SET request_path = CONCAT(LEFT(request_path, CHAR_LENGTH(request_path) -10), '.html')
WHERE request_path LIKE '%.html.html';

但它给出了以下错误 -

#1062 - Duplicate entry 'test/test.html-1' for key 'URL_REWRITE_REQUEST_PATH_STORE_ID'

如果我删除了此条目,那么它开始对其他一些值给出相同的错误。我无法超越这个错误。任何人都可以帮助解决这个问题吗?

表格的结构看起来像 -

【问题讨论】:

  • 请检查 'test/test.html-1' 是否在 request_path 中。还要检查 request_path 字段是否设置为唯一
  • 是的,它就在那里。

标签: mysql sql database string str-replace


【解决方案1】:

我认为您在 request_path 列中设置了唯一键约束尝试使用此查询删除此约束,然后执行以下替换查询。

ALTER TABLE url_rewrite DROP INDEX URL_REWRITE_REQUEST_PATH_STORE_ID;

那么,

UPDATE url_rewrite
    SET request_path = REPLACE(request_path, '.html.html', '.html')

这会将所有'.html.html' 替换为单个'.html',如果您愿意,也可以在此处使用where 条件。

然后再次使用以下查询重新分配约束:

ALTER TABLE url_rewrite add unique index URL_REWRITE_REQUEST_PATH_STORE_ID (request_path (255))

【讨论】:

  • 能否请您添加如何重新分配索引,因为我需要在我的 cms 中使用它
  • alter table url_rewrite 添加唯一索引 URL_REWRITE_REQUEST_PATH_STORE_ID (request_path (255)) 您可以使用它来重新分配唯一键约束。 @l
  • 拜托@LAW
【解决方案2】:

我不认为你可以。

当您执行 UPDATE 时,您更新的值会与另一个相同的值重复。这违反了表的约束,因此违反了错误

【讨论】:

  • 还有其他方法吗?我只是想为表的所有行将 .html.html 字符串替换为 .html。
  • 让我们从表 url_rewrite 的结构开始...也许你可以编辑你的问题并包含表结构
  • 更新了问题,请检查是否有帮助
  • 如果可以的话,您可以尝试将密钥放到 request_path 列中。但不推荐
  • 是否可以删除密钥,执行查询,然后重新分配密钥,从而不影响 cms 的整体功能
【解决方案3】:

您不能将重复值插入/更新到唯一的属性字段中。

要么更改字段属性(删除唯一属性)

或

在更新前更改 request_path 的值 (初步检查新的请求路径是否已经存在,如果存在,重命名。)

根据您的要求

【讨论】:

  • 感谢您的宝贵时间。
【解决方案4】:

通过更新表,您试图创建重复值,因为它违反了表的键和约束。

您必须检查 url_rewrite 表中的 keys 并确保您选择作为键的 columns 没有重复值。

更新:

在 phpmyadmin 中转到 url_rewrite 表结构,在列下有一个“索引”按钮,单击它您将看到 request_path 列的索引名称。

例如,如果索引名称为 request_path_index,则运行以下查询以删除该索引:

alter table url_rewrite drop index request_path_index

【讨论】:

  • 你建议怎么做?
  • 根据您的表结构,request_path 列设置为具有唯一值,这就是为什么当两条记录在更新后具有相同的 request_path 值时出现错误。如果此列的值不应该是唯一的,只需删除唯一约束就可以了。
  • 您能分享一下如何通过查询来完成吗?
  • 1091 - 不能 DROP 'request_path';检查列/键是否存在这个错误来了
  • 那么在您的情况下,索引名称与列名称不同。请在 phpmyadmin 中转到 url_rewrite 表结构,在列下有一个“索引”按钮,单击它您将看到 request_path 列的索引名称,在查询中使用索引名称而不是 request_path。
【解决方案5】:

你可以试试:

UPDATE url_rewrite 
SET request_path = REPLACE(request_path , '.html.html', '.html')
WHERE request_path LIKE ('%.html.html');

【讨论】:

    猜你喜欢
    • 2012-10-31
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 2018-07-04
    相关资源
    最近更新 更多