MySQL插入位置查询


121

此查询有什么问题:

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

它不带WHERE子句就可以工作。我似乎忘记了我的SQL。

Answers:


237

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像往常一样对其进行增量。


1
感谢您的答复。使用UPDATE查询时,其工作正常。但是,当ID是主键和自动递增键,然后上面的INSERT语句不是关键1. work.Error重复输入“1”
JDGuide

1
@JDeveloper那是因为该行已经存在。正如乍得提到的“ If you're trying to insert a new row with ID 1 you should be usingINSERT INTO”。在您的情况下,您要尝试在ID 1已经存在且它是主键或唯一键并失败的情况下进行插入,因此您应该使用UPDATE语法或INSERT .. ON DUPLICATE KEY语法
Anthony Hatzopoulos

41

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

  1. 插入指定值

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

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

19

您将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。


7
这不是MySQL的REPLACE的工作方式。它执行DELETE(如果该行不存在,则可能是无操作),然后执行INSERT。想想后果。触发器和外键依赖性。而是使用INSERT ... ON DUPLICATE KEY UPDATE。
比尔·卡温


5

插入查询不支持where关键字*

条件适用,因为您可以将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子句插入


4

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

一个)。如果要在插入之前选择:

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;

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


3

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

2

插入=向表中添加行

更新=更新特定行。

where子句在您的插入内容中将描述什么?它没有任何匹配项,该行不存在(尚未)...


2

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

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

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

有道理不是吗?


插入语句中的where子句是否可能
Taja_100,2017年

1

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

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

1

WHEREafter子句中放置了一个条件,该条件用于获取数据或更新行。当您插入数据时,假定该行不存在。

因此,问题是,是否存在ID为1的行?如果是这样,请使用MySQL UPDATE,否则请使用MySQL INSERT


1

如果要为插入数据指定特定的记录,则最好使用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;

没有mate。第一个查询将不起作用。第一个查询是被询问的问题。
JDGuide 2012年

为什么您建议更新插入内容?用户希望插入带有条件的值,而不更新现有记录。
Somnath Muluk

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子句。


1

这是完全错误的。INSERT QUERY没有WHERE子句,只有UPDATE QUERY具有它。如果要添加id = 1的数据,则查询将是

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

1

否。据我所知,您无法在此查询中添加WHERE子句。也许我也忘记了SQL,因为我不确定自己为什么仍然需要它。


1

您不应在Insert语句中使用where条件。如果要这样做,请在更新语句中使用插入,然后更新现有记录。

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

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


1

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

替换为用户(id,体重,期望体重)VALUES(1,160,145);


1

请仔细阅读

这没有意义...甚至从字面上看

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的新行。


是的,您是正确的,知道所有这些事情都会出错。
Asesha George

1

我知道这是一个旧帖子,但是我希望这仍然可以对某人有所帮助,我希望这是一个简单的例子:

背景:

我遇到了很多情况:同一个用户被多次列出并带有多个值,并且我想创建一个新记录,因此在我的情况下,UPDATE没有意义,因此我需要像对待一个特定用户那样处理使用WHERE子句。

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

我认为,通过使用此构造,您实际上可以针对特定用户(具有其他记录的user123),因此您实际上并不需要where子句。

输出可能是:

aUser   aCar
user123 mini
user123 HisOtherCarThatWasThereBefore

1

一种使用INSERT和WHERE的方法是

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




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

1
您可以编辑建议的答案以扩展其功能以及如何解决OP的问题吗?
Ro Yo Mi


0

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

UPDATE table SET column = value WHERE columnid = 1

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

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

在mysql上,您必须更新表。


0

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

INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.