此查询出了什么问题:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
没有WHERE
子句。我好像忘记了我的SQL ..
答案 0 :(得分:209)
MySQL INSERT Syntax不支持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 :(得分:39)
您不能将WHERE子句与VALUES子句组合使用。据我所知,你有两个选择 -
INSERT指定值
INSERT INTO Users(weight, desiredWeight)
VALUES (160,145)
使用SELECT语句INSERT
INSERT INTO Users(weight, desiredWeight)
SELECT weight, desiredWeight
FROM AnotherTable
WHERE id = 1
答案 2 :(得分:19)
您可以使用WHERE子句进行UPDATE查询。当你INSERT时,你假设该行不存在。
在MySQL中,如果要INSERT或UPDATE,可以将REPLACE查询与WHERE子句一起使用。如果WHERE不存在,则为INSERTS,否则为UPDATES。
修改强>
我认为Bill Karwin的观点非常重要,可以从评论中删除并使其显而易见。感谢Bill,自从我使用MySQL以来已经太久了,我记得我有REPLACE的问题,但我忘记了它们是什么。我应该查一查。
这不是MySQL的REPLACE的工作方式。它执行DELETE(如果该行不存在,则可以是无操作),然后是INSERT。想想相关的后果。触发器和外键依赖项。而是使用INSERT ... ON DUPLICATE KEY UPDATE。
答案 3 :(得分:9)
我不相信插入有WHERE子句。
答案 4 :(得分:5)
条件适用,因为您可以在where-condition中使用sub-select语句。 您可以使用子选择执行复杂的插入。
例如:
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条件插入重复信息。
例如,如果您有一个名为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语句中输入值,即使这些值当前未存储在表中。
答案 5 :(得分:4)
这个问题的正确答案是这样的:
A)。如果想在插入前选择:
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)。如果你想从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;
我认为这涵盖了大多数情景
答案 6 :(得分:2)
执行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;
答案 7 :(得分:2)
没有意义......甚至字面意思
INSERT
表示添加new row
,当您说WHERE
时,您可以在SQL
中定义您正在谈论哪一行。
因此,现有行上的条件无法添加新行。
您必须从以下选项中进行选择:
一个。使用UPDATE
代替INSERT
B中。使用INSERT
并删除WHERE
子句(我只是说...)或者如果您真的必须在单个语句中使用INSERT
和WHERE
它可以是仅通过INSERT..SELECT clause ...
INSERT INTO Users( weight, desiredWeight )
SELECT FROM Users WHERE id = 1;
但是这有一个完全不同的目的,如果你将id定义为主键,那么这个插入将失败,否则将插入一个id = 1的新行。
答案 8 :(得分:2)
插入=向表中添加行
Upate =更新特定行。
where子句在插入中描述了什么? 它没有任何东西可以匹配,该行不存在(还)......
答案 9 :(得分:1)
在WHERE
子句之后放置一个条件,它用于获取数据或更新行。插入数据时,假定该行不存在。
所以,问题是,是否存在id为1的行?如果是,请使用MySQL UPDATE,否则请使用MySQL INSERT。
答案 10 :(得分:1)
如果要指定特定记录no来插入数据,最好使用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;
答案 11 :(得分:1)
最简单的方法是使用IF来违反您的密钥约束。这仅适用于INSERT IGNORE,但允许您在INSERT中使用约束。
INSERT INTO Test (id, name) VALUES (IF(1!=0,NULL,1),'Test');
答案 12 :(得分: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子句。
答案 13 :(得分: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
有道理不是吗?
答案 14 :(得分:1)
UPDATE Users SET weight=160, desiredWeight= 145 WHERE id = 1;
答案 15 :(得分:1)
没有。据我所知,您无法将WHERE子句添加到此查询中。也许我也忘记了我的SQL,因为我不知道为什么你还需要它。
答案 16 :(得分:1)
您不应在Insert语句中使用where条件。如果您愿意,请在update语句中使用insert,然后更新现有记录。
实际上我可以知道为什么你需要在Insert语句中使用where子句吗?
也许基于我可能会建议你提供更好选择的原因。
答案 17 :(得分:1)
我认为您最好的选择是使用REPLACE而不是INSERT
替换用户(id,weight,desiredWeight)VALUES(1,160,145);
答案 18 :(得分:1)
您可以根据用户输入执行条件INSERT。 仅当输入变量'$ userWeight'和'$ userDesiredWeight'不为空时,此查询才会插入
INSERT INTO Users(weight, desiredWeight )
select '$userWeight', '$userDesiredWeight'
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
答案 19 :(得分:1)
我知道这是一个很老的帖子,但我希望这仍然有助于某人,我希望这是一个简单的例子:
背景:
我有很多种情况:同一个用户多次列出多个值,我想创建一个新记录,因此UPDATE在我的情况下没有意义,我需要解决一个特定的用户就像我会使用WHERE子句。
INSERT into MyTable(aUser,aCar)
value(User123,Mini)
通过使用这个构造,你实际上是针对特定用户(user123,有其他记录),所以你不需要一个where子句,我想。
输出可能是:
aUser aCar
user123 mini
user123 HisOtherCarThatWasThereBefore
答案 20 :(得分:0)
我认为你应该这样做,如果你想验证表不要使用电子邮件两次
代码:
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);
答案 21 :(得分:0)
您可以使用以下代码进行操作:
INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition
答案 22 :(得分:0)
我认为在指定行上插入值的正确形式是:
UPDATE table SET column = value WHERE columnid = 1
它有效,并且如果您在Microsoft SQL Server上编写,则类似
INSERT INTO table(column) VALUES (130) WHERE id = 1;
在mysql上,您必须更新表。
答案 23 :(得分:0)
使用INSERT和WHERE的一种方法是
INSERT INTO MYTABLE SELECT 953,'Hello',43 WHERE 0 in (SELECT count(*) FROM MYTABLE WHERE myID=953);
在这种情况下,ist就像一个存在测试。如果您运行两次或两次以上,也不例外...
答案 24 :(得分:0)
您不能同时使用INSERT和WHERE。您可以使用UPDATE子句为特定字段中的特定列添加值,如下面的代码;
UPDATE Users
SET weight='160',desiredWeight ='145'
WHERE id =1
答案 25 :(得分:0)
INSERT INTO Users(weight, desiredWeight )
SELECT '$userWeight', '$userDesiredWeight'
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
答案 26 :(得分:0)
我认为我们不能在insert语句中使用where子句
答案 27 :(得分:0)
使用post方法将mysql插入到语句中的正确语法是:
$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";