【问题标题】:MySQL Insert query doesn't work with WHERE clauseMySQL 插入查询不适用于 WHERE 子句
【发布时间】:2010-10-03 20:35:07
【问题描述】:

这个查询有什么问题:

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

它可以在没有WHERE 子句的情况下工作。我似乎忘记了我的 SQL。

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    MySQL INSERT Syntax 不支持 WHERE 子句,因此您的查询将失败。假设您的 id 列是唯一的或主键:

    如果您尝试插入 ID 为 1 的新行,您应该使用:

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

    如果您尝试更改 ID 为 1 的现有行的权重/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 照常增加它。

    【讨论】:

    • 感谢您的好回答。使用 UPDATE 查询时,它工作正常。但是,当 id 是主键和自动增量键时,上面的 INSERT 语句不起作用。错误为键 1 重复条目 '1'。
    • @JDeveloper 那是因为该行已经存在。正如乍得提到的If you're trying to insert a new row with ID 1 you should be using插入。在您的情况下,您尝试在 ID 1 已经存在并且它是主键或唯一键并且失败时插入,因此您应该使用 UPDATE 语法或 INSERT .. ON DUPLICATE KEY 语法
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      OP 的声明将变为;

      UPDATE Users SET weight = 160, desiredWeight = 45 where id = 1;

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

      编辑

      我认为 Bill Karwin 的观点非常重要,足以让我们从 cmets 中脱颖而出并使其非常明显。谢谢比尔,我已经很久没有使用 MySQL 了,我记得我在使用 REPLACE 时遇到了问题,但我忘记了它们是什么。我应该查一下。

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

      【讨论】:

      • 这不是 MySQL 的 REPLACE 的工作方式。它执行 DELETE(如果该行不存在,则可能是空操作),然后是 INSERT。想想后果。触发器和外键依赖项。相反,使用 INSERT...ON DUPLICATE KEY UPDATE。
      【解决方案4】:

      我不相信插入有 WHERE 子句。

      【讨论】:

      • 这是真的,同时也是沙子!
      【解决方案5】:

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

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

      例如:

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

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

      另见How to insert with where clause

      【讨论】:

        【解决方案6】:

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

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

        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)。如果你想从同一张表中克隆一条记录,请记住你不能选择 因此,从您要插入的表中

         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;
        

        我认为这涵盖了大部分场景

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            一种使用 INSERT 和 WHERE 的方法是

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

            【讨论】:

            • 这应该被接受为答案!完美运行!
            【解决方案9】:

            插入 = 向表中添加行

            更新 = 更新特定行。

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

            【讨论】:

              【解决方案10】:

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

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

              【讨论】:

                【解决方案11】:

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

                UPDATE table SET column = value WHERE columnid = 1
                

                它可以工作,如果您在 Microsoft SQL Server 上编写,则类似

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

                在 mysql 上你必须更新表。

                【讨论】:

                  【解决方案12】:

                  这取决于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子句是否可能
                  【解决方案13】:

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

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

                  【讨论】:

                    【解决方案14】:

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

                    那么,问题是,是否有任何 id 为 1 的行?如果是,使用MySQL UPDATE,否则使用MySQL INSERT

                    【讨论】:

                      【解决方案15】:

                      如果您指定一个特定的记录号来插入数据,最好使用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;
                      

                      【讨论】:

                      • 没有伴侣。第一个查询将不起作用。第一个查询是提出的问题。
                      • 为什么你建议更新而不是插入?用户希望插入有条件的值,而不是更新现有记录。
                      【解决方案16】:

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

                      【讨论】:

                        【解决方案17】:

                        完全错误。 INSERT QUERY 没有 WHERE 子句,只有 UPDATE QUERY 有它。如果你想在 id = 1 的地方添加数据,那么你的查询将是

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

                        【讨论】:

                          【解决方案18】:

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

                          【讨论】:

                            【解决方案19】:

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

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

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

                            【讨论】:

                              【解决方案20】:

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

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

                              【讨论】:

                                【解决方案21】:

                                也请阅读本文

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

                                INSERT 表示添加一个new row,当你说WHERE 时,你定义你在SQL 中谈论的是哪一行。

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

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

                                A.使用UPDATE 而不是INSERT

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

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

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

                                【讨论】:

                                • 是的,你是正确的,知道所有这些事情都会犯错误。
                                【解决方案22】:

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

                                背景:

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

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

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

                                输出可能是:

                                aUser   aCar
                                user123 mini
                                user123 HisOtherCarThatWasThereBefore
                                

                                【讨论】:

                                  【解决方案23】:

                                  mysql insert into 语句使用 post 方法的正确语法是:

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

                                  【讨论】:

                                  • 您需要对用户名等不受信任的参数进行转义或使用参数化查询来防止攻击者injecting arbitrary SQL commands。并使用其中一种 HashCrypt 算法来存储密码。
                                  【解决方案24】:

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

                                  【讨论】:

                                    【解决方案25】:
                                    INSERT INTO Users(weight, desiredWeight )
                                    SELECT '$userWeight', '$userDesiredWeight'  
                                    FROM (select 1 a ) dummy
                                    WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
                                    

                                    【讨论】:

                                    • 您能否编辑您提出的答案以扩展其作用以及它如何解决 OP?
                                    【解决方案26】:

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

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

                                    【讨论】:

                                      【解决方案27】:

                                      你可以用下面的代码做到这一点:

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

                                      【讨论】:

                                        【解决方案28】:

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

                                        代码:

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

                                        【讨论】:

                                          猜你喜欢
                                          • 2021-10-14
                                          • 2023-03-15
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 1970-01-01
                                          相关资源
                                          最近更新 更多