我有下表:
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}},但它没有用。
答案 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');