MySQL 常用的UPDATE操作
概述
測試環境:mysql 5.6.21
步驟
創建測試表
CREATE TABLE `product` (
`proID` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品表主鍵',
`price` decimal(10,2) NOT NULL COMMENT '商品價格',
`type` int(11) NOT NULL COMMENT '商品類別(0生鮮,1食品,2生活)',
`dtime` datetime NOT NULL COMMENT '創建時間',
PRIMARY KEY (`proID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='商品表';
CREATE TABLE `producttype` (
`ID` int(11) NOT NULL COMMENT '商品類別(0生鮮,1食品,2生活)',
`amount` int(11) COMMENT '每種類別商品總金額',
UNIQUE KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品類別資金匯總表'
插入測試數據
INSERT INTO product(price,type,dtime) VALUES(10.00,0,now()),(10.00,1,now()),(10.00,1,now()),(20.00,2,now()),(30.00,3,now());
INSERT INTO producttype(ID) VALUES(1),(2),(3);
SELECT * FROM product;
SELECT * FROM producttype;
單表更新操作
UPDATE product
SET price='20.00',type=0
WHERE proID=2;
關聯更新操作
UPDATE producttype,product
SET producttype.amount=product.price
where product.TYPE = producttype.ID AND product.TYPE=1;
1.查詢所有字段
INSERT INTO producttype(ID) VALUES(4);
UPDATE producttype
SET producttype.amount= (SELECT ifnull(SUM(product.price),0.00) FROM product WHERE product.TYPE = producttype.ID GROUP BY product.TYPE);
注意:大家注意看到rows matched:4,表示符合條件的記錄是4條,實際更新了三條,關聯語句默認不去判斷裡面的關聯的實際行。
2.只查詢需要更新的字段
UPDATE producttype
SET amount=null;
UPDATE producttype,product
SET producttype.amount=
(SELECT ifnull(SUM(product.price),0.00)
FROM product
WHERE product.TYPE = producttype.ID
GROUP BY product.TYPE)
where product.TYPE = producttype.ID;
改用下面這種方法:Rows matched:3,查詢到了符合條件的行是3行,沒有查詢無關聯的行。
總結
mysql的update的關聯操作在5.6中後面不能直接接FROM語句,只能UPDATE 所有的連接表然後WHERE,如果之前有事情其它數據庫產品的習慣在這裡要注意了。