我得到了下表:
productId price
1 price_value1
2 price_value2
3 price_value3
我想在表中插入一个新产品,并为其分配一个新的productId。在这种情况下,其值等于4。所以我希望我的新桌子看起来像这样:
productId price
1 price_value1
2 price_value2
3 price_value3
4 price_value4
据我所知,为了做到这一点,我必须以某种方式检索productId的最大值,并使用INSERT INTO mytable VALUES (productId + 1, price_value4)
插入它。但是我如何找到productId的最大值呢?我试过INSERT INTO mytable VALUES (SELECT MAX(productId) + 1 FROM mytable, price_value4)
,但没用。
这应该有效:
从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(10)更改为INT(5),这取决于您想要给productId列的大小
编辑:
作为对OP评论中的问题的回应,为什么他的解决方案不起作用一些建议说,你必须使插入中的SELECT语句始终位于括号之间
INSERT INTO mytable VALUES ( (SELECT MAX(ID)+1 FROM mytable) , price_value4)
在我的情况下,它返回
(1093):不能指定目标表FROM子句中更新的"mytable">
原因如下(引用文件)
当从中选择并插入到同一个表中时,MySQL会创建一个内部临时表,用于保存SELECT中的行,然后将这些行插入到目标表中。但是,您不能使用插入t。。。选择。。。FROM t当t是临时表时,因为TEMPORARY表不能在同一个表中被引用两次报表
BUT在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')
这是一个重复的问题。为了利用列的自动递增功能,在插入行时不要为该列提供值。创建表的简单语法
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');
请参阅此链接