MySQL插入Where查询

109 mysql sql

这个查询出了什么问题:

INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)

它没有WHERE条款.我好像忘记了我的SQL ..

Cha*_*rch 217

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

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

INSERT INTO Users(id, weight, desiredWeight) VALUES(1, 160, 145);
Run Code Online (Sandbox Code Playgroud)

如果您尝试更改ID为1的现有行的weight/desiredWeight值,则应使用:

UPDATE Users SET weight = 160, desiredWeight = 145 WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)

如果你想要你也可以使用INSERT .. ON DUPLICATE KEY语法如下:

INSERT INTO Users (id, weight, desiredWeight) VALUES(1, 160, 145) ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145
Run Code Online (Sandbox Code Playgroud)

或者像这样:

INSERT INTO Users SET id=1, weight=160, desiredWeight=145 ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145
Run Code Online (Sandbox Code Playgroud)

同样重要的是要注意,如果你的id列是一个自动增量列,那么你也可以从你的INSERT中一起省略它,让mysql正常增加它.


Rus*_*Cam 39

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

  1. INSERT指定值

    INSERT INTO Users(weight, desiredWeight) 
    VALUES (160,145)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用SELECT语句INSERT

    INSERT INTO Users(weight, desiredWeight) 
    SELECT weight, desiredWeight 
    FROM AnotherTable 
    WHERE id = 1
    
    Run Code Online (Sandbox Code Playgroud)


Rob*_*use 19

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

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

编辑

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

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

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

Dan*_*ite 10

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


sak*_*zai 5

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

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

INSERT INTO Users( weight, desiredWeight ) 
  select val1 , val2  from tableXShoulatNotBeUsers
  WHERE somecondition;
Run Code Online (Sandbox Code Playgroud)

b)。如果记录已存在,请使用更新而不是插入:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)

应该

Update Users set weight=160, desiredWeight=145  WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

d)。如果您想从 SAME 表中 CLONE 记录,请记住您无法从要插入的表中进行选择

 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;
Run Code Online (Sandbox Code Playgroud)

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


Som*_*luk 5

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

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

例如:

INSERT INTO suppliers
(supplier_id, supplier_name)
SELECT account_no, name
FROM customers
WHERE city = 'Newark';
Run Code Online (Sandbox Code Playgroud)

通过在insert语句中放置"select",可以快速执行多次插入.

使用此类型的插入,您可能希望检查插入的行数.您可以在执行插入之前通过运行以下SQL语句来确定要插入的行数.

SELECT count(*)
FROM customers
WHERE city = 'Newark';
Run Code Online (Sandbox Code Playgroud)

您可以确保不使用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);
Run Code Online (Sandbox Code Playgroud)

此语句使用子选择插入多个记录.

如果要插入单个记录,可以使用以下语句:

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);
Run Code Online (Sandbox Code Playgroud)

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

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