【问题标题】:Insert new row into mysql table with already-existing primary key使用已经存在的主键将新行插入到 mysql 表中
【发布时间】:2015-04-17 09:25:32
【问题描述】:

我有一个这样的mysql表:

PK    other_id    name      url
1         1       jeff      www.jeff.com
2         2       steve     www.steve.com
3         3       jenn      www.jenn.com
4         4       susan     www.susan.com
5         5       melissa   www.melissa.com

我需要在具有主键 3 的表中输入一个新行。这个主键已经被占用,所以我必须以某种方式拆分它,为新的 PK=3 插入新行,然后附加剩余的行现在将从 PK=4 开始。

PK    other_id    name      url
1         1       jeff      www.jeff.com
2         2       steve     www.steve.com
3         3       josh      www.josh.com  <---- new row added with PK=3
4         4       jenn      www.jenn.com
5         5       susan     www.susan.com
6         6       melissa   www.melissa.com

我尝试了更改表技术,但没有成功。

【问题讨论】:

  • 你为什么要这么做?技术键只是唯一的数字,没有任何语义问题。
  • 您为什么要这样做?这就是PK的作用,做一个稳定的参考记录。如果要将 PK 向下移动,则需要考虑数据库中引用该 PK 字段的任何其他条目。此外,通过在该表上执行任何新插入并应用您的逻辑,将在不久的将来杀死数据库服务器。
  • 应用程序在流式传输时取决于表中的顺序。它以串行方式读取。
  • 然后修改应用程序的 select 语句,使其按所需的顺序排序,并使用另一种方式,然后向下移动行以确定顺序。
  • 我认为您有一些非常独特的要求,但通常这没有任何意义。如果您想以特定顺序查看行,则添加一个带有索引的“order”列,并在插入新行时设置它。这样您就不必更改可能用于关系的 PK,因此如果您更改它(在许多记录上),您也必须在其他表中更改它(在许多记录上)!

标签: mysql primary-key


【解决方案1】:

您可以执行以下操作

INSERT INTO mytable VALUES(....);
SELECT @ID:=LAST_INSERT_ID();
UPDATE mytable SET PK=PK+1, other_id=other_id+1 WHERE PK>=3;
UPDATE mytable SET PK=3, other_id=3 WHERE PK=@ID;

【讨论】:

  • 不要插入 PK=3。使用 0(默认)值插入它。该命令将其插入最后,然后更新以将其放置在正确的位置。
【解决方案2】:

如果您的 other_id 是唯一的,请将其设为 PRIMARY KEY 并去掉 auto_increment PK。

(我同意其他人认为调整 PK 是错误的错误。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    相关资源
    最近更新 更多