【问题标题】:add duplicate value for primary key为主键添加重复值
【发布时间】:2013-08-05 14:04:25
【问题描述】:

我有一个包含字段(id、brand、model、os)的表 id作为主键

表格有 ~ 6000 行

现在我想添加 id=4012(已经存在)的新字段并为 id>4012 增加 id++

最愚蠢的方式:

  1. 制作表备份

  2. 删除 id >= 4012 的条目

  3. 插入 id = 4012 的新条目

  4. 从备份中恢复表

愚蠢,但有效))

寻找更漂亮的解决方案 谢谢

表结构:

CREATE TABLE IF NOT EXISTS `mobileslist` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `brand` text NOT NULL,
  `model` text NOT NULL,
  `os` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=14823 ;

我试试:

UPDATE mobileslist SET id = id + 1 WHERE id IN (SELECT id FROM mobileslist WHERE id >= 4822 ORDER BY id);

但得到了答案:

1093 - 您不能在 FROM 子句中指定目标表 'mobileslist' 进行更新

【问题讨论】:

  • 为什么你需要这样做而不是使用默认的主键值?
  • 这听起来像是一个糟糕的数据库设计。您能给我们提供更多背景信息吗?
  • 只需要插入位置固定的新条目
  • 用于一个品牌的组合车型(紧凑型)

标签: mysql insert key duplicates


【解决方案1】:

1) 创建一个临时表,按 ID 降序排列。
2) 对设置 ID = ID + 1 WHERE ID >= 4012 的临时表执行 UPDATE 查询
3) 删除临时表
4) 对原始表执行插入操作。

【讨论】:

    【解决方案2】:

    希望我理解正确,您想在位置 4012 插入一个新条目,移动并重新分配 Id = 4012 或更多的所有条目,新 id 增加 1。 希望这会有所帮助。

    试试这个:

    UPDATE <TableName>
    SET 
        id = id + 1
    WHERE id IN (SELECT id FROM <TableName> WHERE id >= 4012 ORDER BY id)
    
    INSERT INTO <TableName>
        (id , brand, model , os)
    VALUE
        (4012, "<BrandName>", "<Model>", "<OS>")
    

    更新答案:

    DECLARE @MaxId INT, @Difference INT
    SELECT
        @MaxId = MAX(id)
    FROM mobileslist
    
    SET @Difference = @MaxId - 4012
    
    UPDATE mobileslist
    SET
    id = id + @Difference
    where id >= 4012
    
    INSERT INTO mobileslist
        (id , brand, model , os)
    VALUE
        (4012, "TestBrand", "TestModel", "TestOS")
    
    UPDATE mobileslist
    SET
    id = id - @Difference
    where id > 4012
    

    【讨论】:

    • #1062 - 键“PRIMARY”的重复条目“4013”
    • #1093 - 您不能在 FROM 子句中指定目标表 'mobileslist' 进行更新
    猜你喜欢
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 2020-07-27
    • 2020-09-01
    • 2012-02-10
    • 2017-06-09
    相关资源
    最近更新 更多