MySQLInsert 查询不能与 WHERE 子句一起工作

这个问题有什么问题:

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

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

577746 次浏览

我认为插入没有 WHERE 子句。

对 UPDATE 查询使用 WHERE 子句。

这样一来,OP 的声明就会变成:

更新用户 SET 权重 = 160,期望权重 = 45,其中 id = 1;

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

剪辑

我认为比尔 · 卡尔文的观点非常重要,应该从评论中提出来,并使其非常明显。谢谢 Bill,我已经很长时间没有使用 MySQL 了,我记得我曾经遇到过 REPLACE 的问题,但是我忘记了它们是什么。我应该查一下的。

MySQL 的 REPLACE 不是这样工作的。它执行一个 DELETE (如果该行不存在,则可能为 no-op) ,然后执行一个 INSERT。想想后果。触发器和外键依赖项。相反,在重复的密钥更新中使用插入..。

向表中添加行

Upate = 更新特定行。

你的插入语中的 where 子句会描述什么? 它没有任何要匹配的东西,行不存在(尚未) ..。

您不能将 WHERE 子句与 VALUES 子句组合在一起。据我所知,您有两个选项-

  1. 指定值的 INSERT

    INSERT INTO Users(weight, desiredWeight)
    VALUES (160,145)
    
  2. INSERT using a SELECT statement

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

MySQL插入语法不支持 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 像平常一样递增它。

它取决于 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

有道理,不是吗?

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

如果要在插入前选择:

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

如果你想从同一个表中克隆一条记录,只要记住你不能选择 从表中插入,因此

 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;

我觉得大部分情况都是这样的

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

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

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

所以,问题是,有没有 id 为1的行? 如果有,使用 MySQL 更新,否则使用 MySQL 插入

用 post 方法将 mysql 插入语句的正确语法如下:

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

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

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

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

你的问题是:-

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

这里指定 id = 1,所以最好使用 UPDATE语句来更新现有记录。

现在使用更新查询:-

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

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

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

例如:

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 条件确保不插入重复信息。

例如,如果有一个名为 client 的表,其主键为 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 子句插入

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

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

完全错了。INSERTQUERY 没有 WHERE 子句,只有 UPDATEQUERY 有。如果要添加数据 Where id = 1,那么查询将为

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

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

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

实际上我可以知道为什么你在插入语句中需要一个 where 子句吗? ? ?

也许基于这个原因,我会给你一个更好的选择。

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

替换成用户(id,重量,期望重量)值(1,160,145) ;

把这个也读一下

这根本说不通,就算是字面上的意思

INSERT意味着添加一个 new row,当你说 WHERE的时候,你定义了你在 SQL中所说的行。

因此,在现有行上添加一个条件是不可能的。

你必须从以下方面作出选择:

使用 UPDATE代替 INSERT

使用 INSERT和删除 WHERE子句(我只是说它...) ,或者如果你是真正约束使用 INSERTWHERE在一个单一的声明,它只能通过 SELECT 子句完成..。

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

但是这样做的目的完全不同,如果您已经将 id 定义为主键,那么插入操作将会失败,否则新行将以 id = 1插入。

可以根据用户输入执行条件 INSERT。 只有当输入变量“ $userWeight”和“ $userDesiredweight”不是空白时,此查询才会插入

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

我知道这是一篇老文章,但我希望它仍能帮助到某些人,我希望举一个简单的例子:

背景:

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

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

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

产出可能是:

aUser   aCar
user123 mini
user123 HisOtherCarThatWasThereBefore

不能同时使用 INSERT 和 WHERE。您可以使用 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); 在这种情况下,它就像一个存在测试。如果你运行它两次或更多次,也没有例外..。

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

UPDATE table SET column = value WHERE columnid = 1

如果你在 Microsoft SQL Server 上写字,它也会起作用

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

在 mysql 上必须更新表。

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

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

您可以在每行的“之间包含任何值。不一定要用[]来表示值。不要改变任何东西后,在哪里。只需在给出更新值之后单击 go。

例如:

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

如果希望通过提及表的主键,将一些值插入到每行中已更改表的新列中,那么只需—— >

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

例如,我将城市插入到一个状态中,我知道这个状态的 id 是来自临时表 tmp _ city 的54

下面的代码可以正常工作-

insert into tb_cities (state_id, city_nm) (select '54' , t.city_name from tmp_city t)