MySQL插入Where查询

时间:2009-01-27 20:16:12

标签: sql mysql

此查询出了什么问题:

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

没有WHERE子句。我好像忘记了我的SQL ..

28 个答案:

答案 0 :(得分:209)

MySQL INSERT Syntax不支持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正常增加它。

答案 1 :(得分:39)

您不能将WHERE子句与VALUES子句组合使用。据我所知,你有两个选择 -

  1. INSERT指定值

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

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

答案 2 :(得分:19)

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

在MySQL中,如果要INSERT或UPDATE,可以将REPLACE查询与WHERE子句一起使用。如果WHERE不存在,则为INSERTS,否则为UPDATES。

修改

我认为Bill Karwin的观点非常重要,可以从评论中删除并使其显而易见。感谢Bill,自从我使用MySQL以来已经太久了,我记得我有REPLACE的问题,但我忘记了它们是什么。我应该查一查。

这不是MySQL的REPLACE的工作方式。它执行DELETE(如果该行不存在,则可以是无操作),然后是INSERT。想想相关的后果。触发器和外键依赖项。而是使用INSERT ... ON DUPLICATE KEY UPDATE。

答案 3 :(得分:9)

我不相信插入有WHERE子句。

答案 4 :(得分:5)

插入查询不支持关键字*

条件适用,因为您可以在where-condition中使用sub-select语句。 您可以使用子选择执行复杂的插入。

例如:

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

另见How to insert with where clause

答案 5 :(得分:4)

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

A)。如果想在插入前选择:

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

B)。 IF记录已存在使用更新而不是插入:

 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;

我认为这涵盖了大多数情景

答案 6 :(得分:2)

执行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;

答案 7 :(得分:2)

请继续阅读

没有意义......甚至字面意思

INSERT表示添加new row,当您说WHERE时,您可以在SQL中定义您正在谈论哪一行。

因此,现有行上的条件无法添加新行。

您必须从以下选项中进行选择:

一个。使用UPDATE代替INSERT

B中。使用INSERT并删除WHERE子句(我只是说...)或者如果您真的必须在单个语句中使用INSERTWHERE它可以是仅通过INSERT..SELECT clause ...

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

但是这有一个完全不同的目的,如果你将id定义为主键,那么这个插入将失败,否则将插入一个id = 1的新行。

答案 8 :(得分:2)

插入=向表中添加行

Upate =更新特定行。

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

答案 9 :(得分:1)

WHERE子句之后放置一个条件,它用于获取数据或更新行。插入数据时,假定该行不存在。

所以,问题是,是否存在id为1的行?如果是,请使用MySQL UPDATE,否则请使用MySQL INSERT

答案 10 :(得分:1)

如果要指定特定记录no来插入数据,最好使用UPDATE语句而不是INSERT语句。

您在问题中编写的此类查询类似于虚拟查询。

您的查询是: -

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

在这里,您指定了id = 1,因此最好使用UPDATE语句来更新现有记录。在WHERE的情况下,不建议使用INSERT子句。您应该使用UPDATE

现在使用更新查询: -

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

答案 11 :(得分:1)

最简单的方法是使用IF来违反您的密钥约束。这仅适用于INSERT IGNORE,但允许您在INSERT中使用约束。

INSERT INTO Test (id, name) VALUES (IF(1!=0,NULL,1),'Test');

答案 12 :(得分: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子句。

答案 13 :(得分: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

有道理不是吗?

答案 14 :(得分:1)

总的来说错了。 INSERT QUERY没有WHERE子句,只有UPDATE QUERY有它。如果要添加数据,其中id = 1,那么您的查询将是

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

答案 15 :(得分:1)

没有。据我所知,您无法将WHERE子句添加到此查询中。也许我也忘记了我的SQL,因为我不知道为什么你还需要它。

答案 16 :(得分:1)

您不应在Insert语句中使用where条件。如果您愿意,请在update语句中使用insert,然后更新现有记录。

实际上我可以知道为什么你需要在Insert语句中使用where子句吗?

也许基于我可能会建议你提供更好选择的原因。

答案 17 :(得分:1)

我认为您最好的选择是使用REPLACE而不是INSERT

  

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

答案 18 :(得分:1)

您可以根据用户输入执行条件INSERT。 仅当输入变量'$ userWeight'和'$ userDesiredWeight'不为空时,此查询才会插入

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

答案 19 :(得分:1)

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

背景:

我有很多种情况:同一个用户多次列出多个值,我想创建一个新记录,因此UPDATE在我的情况下没有意义,我需要解决一个特定的用户就像我会使用WHERE子句。

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

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

输出可能是:

aUser   aCar
user123 mini
user123 HisOtherCarThatWasThereBefore

答案 20 :(得分:0)

我认为你应该这样做,如果你想验证表不要使用电子邮件两次

代码:

INSERT INTO tablename(fullname,email) 

SELECT * FROM (SELECT 'fullnameValue' AS fullname_field,'emailValue' AS email_field) entry WHERE entry.email_field NOT IN (SELECT email FROM tablename);

答案 21 :(得分:0)

您可以使用以下代码进行操作:

INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition

答案 22 :(得分:0)

我认为在指定行上插入值的正确形式是:

UPDATE table SET column = value WHERE columnid = 1

它有效,并且如果您在Microsoft SQL Server上编写,则类似

INSERT INTO table(column) VALUES (130) WHERE id = 1;

在mysql上,您必须更新表。

答案 23 :(得分:0)

使用INSERT和WHERE的一种方法是

INSERT INTO MYTABLE SELECT 953,'Hello',43 WHERE 0 in (SELECT count(*) FROM MYTABLE WHERE myID=953); 在这种情况下,ist就像一个存在测试。如果您运行两次或两次以上,也不例外...

答案 24 :(得分:0)

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

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

答案 25 :(得分:0)

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

答案 26 :(得分:0)

我认为我们不能在insert语句中使用where子句

答案 27 :(得分:0)

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

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