Answers:
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像往常一样对其进行增量。
If you're trying to insert a new row with ID 1 you should be using
INSERT INTO”。在您的情况下,您要尝试在ID 1已经存在且它是主键或唯一键并失败的情况下进行插入,因此您应该使用UPDATE语法或INSERT .. ON DUPLICATE KEY语法
您将WHERE子句用于UPDATE查询。插入时,您假设该行不存在。
OP的声明将变为:
更新用户设置权重= 160,期望权重= 45,其中id = 1;
在MySQL中,如果要INSERT或UPDATE,可以将REPLACE查询与WHERE子句一起使用。如果WHERE不存在,则插入,否则更新。
编辑
我认为,比尔·卡文(Bill Karwin)的观点很重要,可以使其脱离评论并变得显而易见。感谢Bill,自从我与MySQL合作以来已经很久了,我记得我在REPLACE上遇到了问题,但是我忘记了它们是什么。我应该查一下。
这不是MySQL的REPLACE的工作方式。它执行DELETE(如果该行不存在,则可能是无操作),然后是INSERT。想想后果。触发器和外键依赖性。而是使用INSERT ... ON DUPLICATE KEY UPDATE。
条件适用,因为您可以将where条件用于子选择语句。您可以使用子选择执行复杂的插入。
例如:
INSERT INTO suppliers
(supplier_id, supplier_name)
SELECT account_no, name
FROM customers
WHERE city = 'Newark';
通过在插入语句中放置“选择”,可以快速执行多次插入。
使用这种类型的插入,您可能希望检查要插入的行数。您可以通过在执行插入之前运行以下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子句插入
这个问题的正确答案将是这样的:
一个)。如果要在插入之前选择:
INSERT INTO Users( weight, desiredWeight )
select val1 , val2 from tableXShoulatNotBeUsers
WHERE somecondition;
b)。如果记录已经存在,请使用update而不是insert:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
应该
Update Users set weight=160, desiredWeight=145 WHERE id = 1;
C)。如果要同时更新或插入
Replace Users set weight=160, desiredWeight=145 WHERE id = 1;
Note):- you should provide values to all fields else missed field in query
will be set to null
d)。如果要从SAME表中克隆记录,请记住您无法从要插入的表中进行选择,因此
create temporary table xtable ( weight int(11), desiredWeight int(11) ;
insert into xtable (weight, desiredWeight)
select weight, desiredWeight from Users where [condition]
insert into Users (weight, desiredWeight)
select weight , desiredWeight from xtable;
我认为这涵盖了大多数情况
在执行INSERT语句时,您根本无法使用WHERE:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
应该:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 );
WHERE部分仅在SELECT语句中起作用:
SELECT from Users WHERE id = 1;
或在UPDATE语句中:
UPDATE Users set (weight = 160, desiredWeight = 145) WHERE id = 1;
您可以根据用户输入进行条件INSERT。仅当输入变量'$ userWeight'和'$ userDesiredWeight'不为空时,此查询才会插入
INSERT INTO Users(weight, desiredWeight )
select '$userWeight', '$userDesiredWeight'
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
这取决于INSERT实际可以具有where子句的情况。
例如,如果要匹配表单中的值。
Consider INSERT INTO Users(name,email,weight, desiredWeight) VALUES (fred,bb@yy.com,160,145) WHERE name != fred AND email != bb@yy.com
有道理不是吗?
最简单的方法是使用IF违反密钥约束。这仅适用于INSERT IGNORE,但将允许您在INSERT中使用约束。
INSERT INTO Test (id, name) VALUES (IF(1!=0,NULL,1),'Test');
在WHERE
after子句中放置了一个条件,该条件用于获取数据或更新行。当您插入数据时,假定该行不存在。
因此,问题是,是否存在ID为1的行?如果是这样,请使用MySQL UPDATE,否则请使用MySQL INSERT。
如果要为插入数据指定特定的记录,则最好使用UPDATE
语句而不是INSERT
语句。
您在问题中编写的这种查询就像一个虚拟查询。
您的查询是:-
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
在这里,你指定ID = 1,所以最好使用UPDATE
语句来更新现有record.It不推荐使用WHERE
条款中情况INSERT
。你应该使用UPDATE
。
现在使用更新查询:
UPDATE Users SET weight=160,desiredWeight=145 WHERE id=1;
在任何情况下,WHERE条款都可以与INSERT-INTO-VALUES一起实际使用吗?
答案是肯定的。
在INSERT INTO ... VALUES ...之后添加WHERE子句只是无效的SQL,并且不会解析。
MySQL返回的错误是:
mysql> INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id = 1' at line 1
错误消息最重要的部分是
... syntax to use near 'WHERE id = 1' ...
其中显示了解析器无法在此处找到的特定部分:WHERE子句。
这没有意义...甚至从字面上看
INSERT
表示添加一个,new row
并且当您说WHERE
您定义时,您要定义的行SQL
。
因此,以现有行为条件添加新行是不可能的。
您必须从以下选项中进行选择:
A.使用UPDATE
代替INSERT
B. Use INSERT
和remove WHERE
子句(我只是在说...),或者如果您确实有使用的意愿,INSERT
并且WHERE
在单个语句中只能通过INSERT..SELECT子句来完成...
INSERT INTO Users( weight, desiredWeight )
SELECT FROM Users WHERE id = 1;
但这有完全不同的目的,如果您将id定义为主键,则此插入将失败,否则将插入id = 1的新行。
我知道这是一个旧帖子,但是我希望这仍然可以对某人有所帮助,我希望这是一个简单的例子:
背景:
我遇到了很多情况:同一个用户被多次列出并带有多个值,并且我想创建一个新记录,因此在我的情况下,UPDATE没有意义,因此我需要像对待一个特定用户那样处理使用WHERE子句。
INSERT into MyTable(aUser,aCar)
value(User123,Mini)
我认为,通过使用此构造,您实际上可以针对特定用户(具有其他记录的user123),因此您实际上并不需要where子句。
输出可能是:
aUser aCar
user123 mini
user123 HisOtherCarThatWasThereBefore
您不能同时使用INSERT和WHERE。您可以使用UPDATE子句为特定字段中的特定列添加值,如下面的代码;
UPDATE Users
SET weight='160',desiredWeight ='145'
WHERE id =1