MySQL插入Where查询

这个查询有什么问题:

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子句组合在一起。 就我所知,你有两个select –

  1. INSERT指定值

     INSERT INTO Users(weight, desiredWeight) VALUES (160,145) 
  2. INSERT使用SELECT语句

     INSERT INTO Users(weight, desiredWeight) SELECT weight, desiredWeight FROM AnotherTable WHERE id = 1 

您使用WHERE子句进行UPDATE查询。 当你插入时,你假设该行不存在。

在MySQL中,如果你想要INSERT或UPDATE,你可以使用带有WHERE子句的REPLACE查询。 如果WHERE不存在,则插入,否则更新。

编辑

我认为比尔·卡尔文的观点非常重要,可以从评论中脱颖而出,并且非常明显。 感谢比尔,我和MySQL一起工作已经太久了,我记得我在REPLACE方面有问题,但是我忘了他们是什么人。 我应该查看它。

这不是MySQL的REPLACE工作方式。 它执行一个DELETE(如果该行不存在,可能是一个空操作),然后是一个INSERT。 想想后果。 触发器和外键依赖。 而是使用INSERT … ON DUPLICATE KEY UPDATE。

我不相信插入有一个WHERE子句。

插入查询不支持关键字*

条件适用,因为您可以使用where子条件select语句。 您可以使用子select执行复杂的插入。

例如:

 INSERT INTO suppliers (supplier_id, supplier_name) SELECT account_no, name FROM customers WHERE city = 'Newark'; 

通过在insert语句中放置“select”,可以快速执行多个插入。

使用这种types的插入,您可能希望检查插入的行数。 在执行插入之前,您可以通过运行以下SQL语句来确定要插入的行数。

 SELECT count(*) FROM customers WHERE city = 'Newark'; 

您可以确保您不使用EXISTS条件插入重复的信息。

例如,如果您有一个名为client的表,其中的主键是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); 

这个语句用一个子select插入多个logging。

如果你想插入一条logging,你可以使用下面的语句:

 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语句中input值,即使这些值当前没有存储在表中。

另请参见如何使用where子句插入

这个问题的正确答案是这样的:

一个)。 如果想在插入之前select:

 INSERT INTO Users( weight, desiredWeight ) select val1 , val2 from tableXShoulatNotBeUsers WHERE somecondition; 

B)。 IFlogging已经存在使用更新代替插入:

  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表的logging,只记得你不能从你插入的表中select

  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; 

我认为这很适合大部分情况

插入=将行添加到表中

Upate =更新特定的行。

where子句在插入中描述什么? 它没有任何东西匹配,行不存在(还)…

在执行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意味着添加一个new row ,当你说你在WHERE定义你在SQL谈论哪一行。

所以添加一个新行是不可能的,在现有的行的条件。

你必须从以下select:

A.使用UPDATE而不是INSERT

B.使用INSERT和删除WHERE子句(我只是说…),或者如果你真的要在一个语句中使用INSERTWHERE ,只能通过INSERT..SELECT子句来完成…

 INSERT INTO Users( weight, desiredWeight ) SELECT FROM Users WHERE id = 1; 

但是,这提供了一个完全不同的目的,如果你已经定义了id作为主键这个插入将失败,否则将插入一个新的行id = 1。

这取决于情况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子句之后,你放置一个条件,它用于获取数据或更新行。 在插入数据时,假定该行不存在。

所以,问题是,有没有行的ID是1? 如果是的话,使用MySQL UPDATE ,否则使用MySQL INSERT 。

如果你指定一个特定的logging号来插入数据,那么最好使用UPDATE语句而不是INSERT语句。

您在问题中编写的这种types的查询就像是一个虚拟查询。

您的查询是:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1; 

在这里,你指定了id = 1,所以你用UPDATE语句来更新现有的logging。不build议在INSERT情况下使用WHERE子句。你应该使用UPDATE

现在使用更新查询: –

 UPDATE Users SET weight=160,desiredWeight=145 WHERE id=1; 

WHERE子句在任何情况下都可以实际与INSERT-INTO-VALUES一起使用吗?

答案肯定是否定的。

在INSERT INTO … VALUES …之后添加WHERE子句只是无效的SQL,不会被parsing。

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' ... 

它显示了parsing器在这里找不到的具体部分:WHERE子句。

其总体错误。 INSERT QUERY没有WHERE子句,只有UPDATE QUERY才有。 如果你想添加数据其中id = 1那么你的查询将是

 UPDATE Users SET weight=160, desiredWeight= 145 WHERE id = 1; 

不,据我所知,你不能在这个查询中添加WHERE子句。 也许我已经忘记了我的SQL,因为我不太清楚为什么你需要它。

你不应该在Insert语句中使用where条件。 如果你想这样做,使用插入更新语句,然后更新现有的logging。

其实我可以知道为什么你需要在插入语句中的where子句?

也许基于我可能会build议你一个更好的select的原因。

我认为你最好的select是使用REPLACE而不是INSERT

replace用户(id,weight,desiredWeight)VALUES(1,160,145);

你可以根据用户input做条件插入。 只有当inputvariables'userWeight'和'$ userDesiredWeight'不为空时,这个查询才会执行插入操作

 INSERT INTO Users(weight, desiredWeight ) select '$userWeight', '$userDesiredWeight' FROM (select 1 a ) dummy WHERE '$userWeight' != '' AND '$userDesiredWeight'!=''; 

我知道这是一个旧post,但我希望这仍然有助于某人,我希望是一个简单的例子:

背景:

我有一个多到很多的情况:同一个用户多次列出多个值,我想创build一个新的logging,因此UPDATE对我来说是没有意义的,我需要像一个特定的用户使用WHERE子句。

 INSERT into MyTable(aUser,aCar) value(User123,Mini) 

通过使用这个构造你实际上是针对一个特定的用户(user123,谁有其他logging),所以你不需要一个where子句,我认为。

输出可能是:

 aUser aCar user123 mini user123 HisOtherCarThatWasThereBefore 

mysql使用post方法插入语句的正确语法是:

 $sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')"; 

我不认为我们可以在插入语句中使用where子句

 INSERT INTO Users(weight, desiredWeight ) SELECT '$userWeight', '$userDesiredWeight' FROM (select 1 a ) dummy WHERE '$userWeight' != '' AND '$userDesiredWeight'!=''; 

您不能同时使用INSERT和WHERE。 你可以使用UPDATE子句来添加值到特定字段的特定字段,如下面的代码;

 UPDATE Users SET weight='160',desiredWeight ='145' WHERE id =1