【发布时间】:2010-10-03 20:35:07
【问题描述】:
这个查询有什么问题:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
它可以在没有WHERE 子句的情况下工作。我似乎忘记了我的 SQL。
【问题讨论】:
这个查询有什么问题:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
它可以在没有WHERE 子句的情况下工作。我似乎忘记了我的 SQL。
【问题讨论】:
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 照常增加它。
【讨论】:
If you're trying to insert a new row with ID 1 you should be using插入。在您的情况下,您尝试在 ID 1 已经存在并且它是主键或唯一键并且失败时插入,因此您应该使用 UPDATE 语法或 INSERT .. ON DUPLICATE KEY 语法
您不能将 WHERE 子句与 VALUES 子句结合使用。据我所知,您有两种选择-
插入指定值
INSERT INTO Users(weight, desiredWeight)
VALUES (160,145)
使用 SELECT 语句插入
INSERT INTO Users(weight, desiredWeight)
SELECT weight, desiredWeight
FROM AnotherTable
WHERE id = 1
【讨论】:
您将 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。
【讨论】:
我不相信插入有 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);
使用双表允许您在选择语句中输入值,即使这些值当前未存储在表中。
【讨论】:
这个问题的正确答案是这样的:
一)。如果要在插入前选择:
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;
我认为这涵盖了大部分场景
【讨论】:
在执行 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);
在这种情况下,就像一个存在测试。运行两次以上也不例外...
【讨论】:
插入 = 向表中添加行
更新 = 更新特定行。
插入中的 where 子句会描述什么? 它没有任何可匹配的内容,该行不存在(尚)...
【讨论】:
您可以根据用户输入进行有条件的 INSERT。 仅当输入变量 '$userWeight' 和 '$userDesiredWeight' 不为空时,此查询才会插入
INSERT INTO Users(weight, desiredWeight )
select '$userWeight', '$userDesiredWeight'
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
【讨论】:
我认为在指定行上插入值的正确形式是:
UPDATE table SET column = value WHERE columnid = 1
它可以工作,如果您在 Microsoft SQL Server 上编写,则类似
INSERT INTO table(column) VALUES (130) WHERE id = 1;
在 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
有意义不是吗?
【讨论】:
最简单的方法是使用 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语句来更新已有记录。不建议使用WHERE子句以防INSERT。你应该使用UPDATE .
现在使用更新查询:-
UPDATE Users SET weight=160,desiredWeight=145 WHERE id=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 子句。
【讨论】:
完全错误。 INSERT QUERY 没有 WHERE 子句,只有 UPDATE QUERY 有它。如果你想在 id = 1 的地方添加数据,那么你的查询将是
UPDATE Users SET weight=160, desiredWeight= 145 WHERE id = 1;
【讨论】:
没有。据我所知,您不能将 WHERE 子句添加到此查询中。也许我也忘记了我的 SQL,因为我不确定你为什么需要它。
【讨论】:
您不应该在插入语句中使用 where 条件。如果您想这样做,请在更新语句中使用 insert,然后更新现有记录。
其实我能知道为什么你需要在 Insert 语句中使用 where 子句吗?
也许基于我可能会建议你一个更好的选择的原因。
【讨论】:
我认为您最好的选择是使用 REPLACE 而不是 INSERT
替换成用户(id, weight, desiredWeight) VALUES(1, 160, 145);
【讨论】:
这没有意义......甚至是字面意思
INSERT 表示添加一个new row,当你说WHERE 时,你定义你在SQL 中谈论的是哪一行。
因此,在现有行的条件下无法添加新行。
您必须从以下选项中进行选择:
A.使用UPDATE 而不是INSERT
B.使用INSERT 并删除WHERE 子句(我只是说...),或者如果您真的必须在单个语句中使用INSERT 和WHERE,则只能通过INSERT..SELECT clause 完成。 .
INSERT INTO Users( weight, desiredWeight )
SELECT FROM Users WHERE id = 1;
但这用于完全不同的目的,如果您将 id 定义为主键,则此插入将失败,否则将插入 id = 1 的新行。
【讨论】:
我知道这是一篇旧帖子,但我希望这仍然对某人有所帮助,我希望这是一个简单的例子:
背景:
我遇到了多对多的情况:同一个用户被多次列出并带有多个值,我想创建一条新记录,因此 UPDATE 在我的情况下没有意义,我需要像处理特定用户一样我会使用 WHERE 子句。
INSERT into MyTable(aUser,aCar)
value(User123,Mini)
通过使用这个结构,你实际上是针对一个特定的用户(user123,他有其他记录)所以你真的不需要 where 子句,我想。
输出可能是:
aUser aCar
user123 mini
user123 HisOtherCarThatWasThereBefore
【讨论】:
mysql insert into 语句使用 post 方法的正确语法是:
$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);
【讨论】: