English 中文(简体)
MySQL 插入查询在有 WHERE 子句时不起作用。
原标题:
  • 时间:2009-01-27 20:16:11
  •  标签:

这个查询有什么问题:

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的现有行的重量/所需重量值,您应该使用:

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列是自动递增列,则最好完全省略它,让mysql正常递增。

问题回答

您不能将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
    

您在 UPDATE 查询中使用 WHERE 子句。当您进行插入操作时,您假定该行不存在。

OP的声明将变成;

更新用户表,将id为1的用户的体重设为160,期望体重设为45。

在MySQL中,在进行INSERT或UPDATE操作时,可以使用带有WHERE子句的REPLACE查询。如果WHERE不存在,则执行INSERT操作,否则执行UPDATE操作。

编辑

我认为Bill Karwin的观点很重要,足以从评论中提取出来使其非常明显。谢谢Bill,自从我上次使用MySQL以来已经太长时间了,我记得我遇到了REPLACE问题,但我忘记了具体问题。我应该查一下。

这并不是 MySQL 的 REPLACE 的工作方式。它会执行一个 DELETE(如果该行不存在,则可能没有操作),然后是一个 INSERT。考虑触发器和外键依赖的后果。相反,使用 INSERT…ON DUPLICATE KEY UPDATE。

我不相信插入语句有 WHERE 子句。

Insert query doesn t support where keyword*

Conditions apply because you can use where condition for sub-select statements. You can perform complicated inserts using sub-selects.

例如:

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

通過在插入語句中放置“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);

使用双表使您能够在选择语句中输入值,即使这些值当前未存储在表中。

另请参阅如何使用where子句进行插入

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

如果想在插入之前进行选择:

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

如果记录已经存在,则使用更新而不是插入。

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

应该是 (yīng gāi shì)

Update Users set weight=160, desiredWeight=145  WHERE id = 1;

如果你想同时更新或插入

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). If you want to CLONE a record from SAME table, just remember you cann t select from table to which you are inserting therefore

 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和WHERE的方法是

INSERT INTO MYTABLE SELECT 953, Hello ,43 WHERE 0 in (SELECT count(*) FROM MYTABLE WHERE myID=953); In this case ist like an exist-test. There is no exception if you run it two or more times...

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

UPDATE table SET column = value WHERE columnid = 1

它能够正常工作,并且如果你在Microsoft SQL Server上书写,它也是相似的。

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

在MySQL中,您必须更新表。

插入 = 向表中添加行

更新 = 更新特定行。

What would the where clause describe in your insert? It doesn t have anything to match, the row doesn t exist (yet)...

You can do conditional INSERT based on user input. This query will do insert only if input vars $userWeight and $userDesiredWeight are not blank

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

如果您想通过指定其主键在每一行中将某些值插入到修改后的表的新列中,则只需-->

  1. UPDATE <table_name> SET <column_name> = <value> WHERE <primary_key> = <primary_value>

这取决于情况,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。

如果您正在为插入数据指定特定的记录编号,最好使用UPDATE语句,而不是INSERT语句。

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

你的查询是:-

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

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

现在使用更新查询:-

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

Does WHERE-clause can be actually used with INSERT-INTO-VALUES in any case?

答案明确是不。

在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 QUERY没有WHERE子句,只有UPDATE QUERY有它。如果你想增加数据 Where id = 1,那么你的查询将是

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

不可以,就我所知,你不能在这个查询中添加WHERE子句。也许我也忘记了SQL,因为我真的不确定你为什么需要它。

你不应该在插入语句中使用条件语句。如果你想要这么做,可以先使用插入语句创建一个新纪录,在使用更新语句更新已存在的纪录。

其实,可以告诉我为什么需要在插入语句中使用where子句吗?

也许根据原因,我可以向您建议更好的选项。

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

REPLACE INTO Users(id, weight, desiredWeight) VALUES(1, 160, 145); 替换到用户(id,体重,期望体重)具有值(1, 160, 145)的记录;

DO READ THIS AS WELL

这没有意义...甚至字面上都是这样

INSERT 意味着添加一行新行,当你说 WHERE 时,你定义了在SQL中你正在谈论哪一行。

因此,在现有行上加入新行是不可能的,有条件限制。

你必须从以下选择:

A. 使用UPDATE而不是INSERT

B. 使用 INSERT 并删除 WHERE 子句(我只是这么说...)或者如果你真的需要在一个语句中同时使用 INSERTWHERE,那么只能通过 INSERT..SELECT 子句 实现...

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

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

我知道这是一篇老文章,但我仍然希望这个简单的例子能对某人有所帮助:

背景 (bèi jǐng)

我有一个多对多的情况:同一个用户以多个值列出多次,我想要创建一个新记录,因此在我的情况下更新没有意义,我需要像使用 WHERE 子句一样单独处理特定的用户。

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

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

输出可能是:

aUser   aCar
user123 mini
user123 HisOtherCarThatWasThereBefore

使用POST方法插入MySQL语句的正确语法为:

$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

你可以用以下代码完成这个操作:

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

如果您想验证表格不重复使用电子邮件,我认为您应该这样做。

代码:

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);

所有以上回答都给出了纯MySQL语句。

如果您正在使用PHPMyAdmin中的where条件来更新表中现有行,则以下是建议使用的方式。

UPDATE `Table_Name` SET `row1`= [value-1] ,`row2`= [value-2] ,`row3`= [value-3]  WHERE 1

你可以在每行中包含任何值之间的值。不一定要放[]来表示价值。在where之后不要更改任何内容。在提供价值后,只需单击“go”即可更新。

例子:

UPDATE `Mytable_name` SET `abc`= xyz ,`def`= uvw 
 WHERE 1




相关问题
热门标签