这个查询出了什么问题:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
它没有WHERE
条款.我好像忘记了我的SQL ..
MySQL INSERT语法不支持WHERE子句,因此您的查询将失败.假设您的id
列是唯一或主键:
如果您尝试插入ID为1的新行,则应该使用:
INSERT INTO Users(id, weight, desiredWeight) VALUES(1, 160, 145);
如果您尝试更改ID为1的现有行的weight/desiredWeight值,则应使用:
UPDATE Users SET weight = 160, desiredWeight = 145 WHERE id = 1;
如果你想要你也可以使用INSERT .. ON DUPLICATE KEY语法如下:
INSERT INTO Users (id, weight, desiredWeight) VALUES(1, 160, 145) ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145
或者像这样:
INSERT INTO Users SET id=1, weight=160, desiredWeight=145 ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145
同样重要的是要注意,如果你的id
列是一个自动增量列,那么你也可以从你的INSERT中一起省略它,让mysql正常增加它.
您不能将WHERE子句与VALUES子句组合使用.据我所知,你有两个选择 -
INSERT指定值
INSERT INTO Users(weight, desiredWeight) VALUES (160,145)
使用SELECT语句INSERT
INSERT INTO Users(weight, desiredWeight) SELECT weight, desiredWeight FROM AnotherTable WHERE id = 1
您可以使用WHERE子句进行UPDATE查询.INSERT时,假设该行不存在.
在MySQL中,如果要INSERT或UPDATE,可以将REPLACE查询与WHERE子句一起使用.如果WHERE不存在,则INSERTS,否则更新.
编辑
我认为Bill Karwin的观点非常重要,可以从评论中剔除并使其显而易见.感谢Bill,自从我使用MySQL以来已经太久了,我记得我有REPLACE的问题,但我忘记了它们是什么.我应该查一查了.
这不是MySQL的REPLACE的工作方式.它执行DELETE(如果该行不存在,则可以是无操作),然后是INSERT.想想相关的后果.触发器和外键依赖项.而是使用INSERT ... ON DUPLICATE KEY UPDATE.
我不相信插入有一个WHERE子句.
条件适用,因为您可以将where条件用于子选择语句.您可以使用子选择执行复杂的插入.
例如:
INSERT INTO suppliers (supplier_id, supplier_name) SELECT account_no, name FROM customers WHERE city = 'Newark';
通过在insert语句中放置"select",可以快速执行多次插入.
使用此类型的插入,您可能希望检查插入的行数.您可以在执行插入之前通过运行以下SQL语句来确定要插入的行数.
SELECT count(*) FROM customers WHERE city = 'Newark';
您可以确保不使用EXISTS条件插入重复信息.
例如,如果您有一个名为clients的表,其主键为client_id,则可以使用以下语句:
INSERT INTO clients (client_id, client_name, client_type) SELECT supplier_id, supplier_name, 'advertising' FROM suppliers WHERE not exists (select * from clients where clients.client_id = suppliers.supplier_id);
此语句使用子选择插入多个记录.
如果要插入单个记录,可以使用以下语句:
INSERT INTO clients (client_id, client_name, client_type) SELECT 10345, 'IBM', 'advertising' FROM dual WHERE not exists (select * from clients where clients.client_id = 10345);
使用双表允许您在select语句中输入值,即使这些值当前未存储在表中.
另请参见如何使用where子句插入