将一条新记录插入到一​​个mysql表中,其中一个值加1

时间:2017-11-06 16:29:35

标签: mysql

我有下表:

productId    price
1            price_value1
2            price_value2
3            price_value3
4            price_value4

我想在表格中插入一个新产品并为其分配一个新的productId。在这种情况下,其值等于4。 所以我希望我的新表看起来像这样:

INSERT INTO mytable VALUES (productId + 1, price_value4)

据我所知,为了做到这一点,我必须以某种方式检索productId的最大值并使用INSERT INTO mytable VALUES (SELECT MAX(productId) + 1 FROM mytable, price_value4)插入它。 但是如何找出productId的最大值? 我试过{{1}},但它没有用。

2 个答案:

答案 0 :(得分:0)

这应该有效:

从mytable中选择max(productID)和price_value4作为列并插入结果。

INSERT INTO mytable (SELECT MAX(productId) + 1, 'price_value4' FROM mytable);

但是,如果您不打算跳转某个号码,您只需在product_id中添加一个自动增量ID键,然后您只需插入价格,产品ID就会自动递增。 这样做:

ALTER TABLE mytable 
MODIFY COLUMN `productId` INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;

您可以使用INT(5)更改INT(10),例如,删除您要为productId列提供的大小

编辑:

回到评论中的OP问题,为什么他的解决方案不起作用 一些建议说你必须在插入中使SELECT语句始终在括号

之间
INSERT INTO mytable VALUES ( (SELECT MAX(ID)+1 FROM mytable) , price_value4)

..在我的案例中它返回

  

(1093):您无法指定目标表   ' MYTABLE'用于FROM子句中的更新

AND HERE IS WHY(引自文档)

  

当选择并插入同一个表时,MySQL会创建   一个内部临时表,用于保存SELECT中的行然后   将这些行插入目标表。但是,你不能使用   INSERT INTO t ... SELECT ... FROM t当t是TEMPORARY表时,   因为TEMPORARY表不能在同一个表中引用两次   声明

但是通过在FROM中使用查询而不是表本身来克服这种情况,这会影响复制请求的表值而不是引用您正在更新的表。

INSERT INTO mytable VALUES ( 
   (SELECT MAX(ID)+1 FROM (SELECT * FROM mytable ) as mytmp ), 
   'price_value4');

OR(从文档中引用)

  

当SELECT和时,避免模糊的列引用问题   INSERT引用同一个表,为每个表提供唯一的别名   在SELECT部分​​中使用,并使用该部分限定列中的列名   适当的别名。

INSERT INTO mytable Values ( (SELECT MAX(ID)+1 FROM mytable as mytmp) , 'price_value4')

答案 1 :(得分:0)

这是一个重复的问题。为了利用列的自动递增功能,在插入行时不要为该列提供值。 创建表的简单语法

CREATE TABLE Product (
     productId MEDIUMINT NOT NULL AUTO_INCREMENT,
     price INT NOT NULL,
     PRIMARY KEY (productid)
);

插入提供的默认值或将列保留为空白或提供的值为NULL。请看下面的代码段。

INSERT INTO Product (price) VALUES
    ('10'),('20'),('4'),
    ('30');

refer this link