带条件的 SQL 插入查询

Posted

技术标签:

【中文标题】带条件的 SQL 插入查询【英文标题】:SQL Insert Query With Condition 【发布时间】:2015-08-16 19:29:34 【问题描述】:

我试图在满足条件时将值插入表的 1 列。

注意:该表已包含所有列的数据,但 1 为空。我想根据 WHERE 子句将值插入到这 1 列中。

我有这个问题:

INSERT INTO <TABLE_NAME>
(COLUMN_NAME)
(VALUE)
WHERE <CONDITION>

我遇到了一个异常:

WHERE 关键字附近的语法不正确

我可以使用 UPDATE 来做到这一点:

UPDATE <TABLE_NAME>
SET <COL_NAME>
WHERE <CONDITION>

但是想知道为什么 INSERT 查询失败了。任何建议表示赞赏。

【问题讨论】:

您能澄清一下您要做什么吗?也许提供一些示例数据? 带有 where 条件的插入会做什么?您是否尝试更新? 恐怕还没有在表中的行不能满足条件。 什么意思 - 试图将值插入 1 列。这是否意味着其他列值已经存在但特定列值不存在? @Mureinik 帖子的标题很清楚。如何根据条件进行插入? 【参考方案1】:

据我了解您的问题,您已经在一行中有数据,而该行中的一列没有值,因此您想在该列中添加值。

这是更新现有行的场景,而不是插入新行。当数据已经存在并且您想要修改记录时,您必须使用 UPDATE 子句。当您要在表格中插入新行时选择插入。

因此,在您当前的情况下,更新子句是您与 Where 子句的朋友,因为您想修改记录的子集而不是全部。

UPDATE <TABLE_NAME>
SET <COL_NAME>
WHERE <CONDITION>

根据任何 RDBMS 语法(我认为),INSERT 子句没有任何 Where 子句。 Insert 是无条件的 sql 查询,而 SELECT、UPDATE、DELETE 都是条件命令,可以在后面的所有语句中添加 Where 子句。

【讨论】:

【参考方案2】:

要在已填充行的情况下向一列添加值,您需要使用更新语句。 如果需要插入具有 where 子句的新行,则需要使用 insert into select 语句:

INSERT INTO <table> (<columns>)
SELECT <columns>
FROM <table>
WHERE <condition>;

【讨论】:

INSERT INTO SELECT 命令先从另一个表中选择记录,然后插入,没有where子句或条件插入到主表中【参考方案3】:

SQL Insert 不接受 where 参数,你可以检查一下:SQL Insert Definition...

我不知道您想要做什么的全部问题,但仅使用 INSERT 语句是不可能的,但是如果该数据依赖于另一个表或来自另一张桌子...检查这里...SQL Insert explain in wikipedia

像这样:

从其他表复制行

INSERT INTO phone_book2
SELECT *
FROM   phone_book
WHERE  name IN ('John Doe', 'Peter Doe')

INSERT INTO phone_book2 ( [name], [phoneNumber] )
SELECT [name], [phoneNumber]
FROM   phone_book
WHERE  name IN ('John Doe', 'Peter Doe')

【讨论】:

【参考方案4】:

根据您的问题,我感觉您正在尝试更新表中的列而不是插入。

类似:

UPDATE column SET value WHERE different_column_value = some_value

【讨论】:

【参考方案5】:

我知道这有点晚了,对于那些仍然想在插入查询中使用 where 子句的人来说,这有点可能通过 hack。

我的理解是,您只想在条件为真时插入。假设您的数据库“姓氏”中有一个列,并且您只想在表中不存在姓氏时插入。

你有点想要 INSERT INTO table_name blha blha blah WHERE surname!="this_surname" 之类的东西。

解决方案是使该单元格在您的管理面板中独一无二。

【讨论】:

【参考方案6】:

Insert 语句将插入一条新记录。您不能将 where 子句应用于要插入的记录。

where 子句可用于更新您想要的行。 更新 SET = where .

但是 insert 不会有 where 子句。 希望这能回答你的问题

【讨论】:

【参考方案7】:

INSERT 语法不能有 WHERE 子句。唯一一次你会发现 INSERT 有 WHERE 子句是当你使用 INSERT INTO...SELECT 语句时。

【讨论】:

【参考方案8】:

我认为您包含的代码只是一个模板,用于显示您如何构建查询。请参阅 SO 问题 here, here 和 MSDN 问题 here.

在 SQL Server(它使用 Transact-SQL aka T-SQL)中,您需要一个 UPDATE 查询 INSERT 其中列已经有值 - 通过使用答案 @HaveNoDisplayName 给出:)

如果您从代码中执行INSERT / UPDATE(或者如果您经常需要它),我强烈建议您使用带参数的存储过程。

您可以通过使用IF-ELSEINSERT 块添加到过程来进一步扩展过程,以确定是执行INSERT 新记录还是更新现有记录,如this SO 回答中所示。

最后,看看SQLFiddle 的沙盒游乐场,以测试您的 SQL,而不会给您的 RDMS 带来风险 :-)

【讨论】:

【参考方案9】:

我发现有用的私人案例:避免重复的条件插入:

-- create a temporary table with desired values
SELECT 'Peter' FirstName, 'Pan' LastName
INTO #tmp
    
-- insert only if row doesn't exist    
INSERT INTO Persons (FirstName, LastName)
SELECT *
FROM #tmp t
WHERE NOT EXISTS (SELECT * FROM Persons where FirstName=t.FirstName and LastName=t.LastName)

【讨论】:

【参考方案10】:

如果需要为现有行的列添加数据,则为UPDATE

INSERT 正在表格中创建新行。

对于条件INSERT,可以使用MERGE 命令。

【讨论】:

以上是关于带条件的 SQL 插入查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询语句之查询数据

条件 SQL 语句 - 在插入/更新查询之间切换 [重复]

MyBatis 中SQL语句怎么样使用两种类型的参数带条件查询

解决mysql查询,in条件参数为带逗号的字符串,查询结果错误

带条件的 Prisma 查询

sql参数查询