【问题标题】:SQL: How can I insert a row if table is empty, otherwise do nothing?SQL:如果表为空,如何插入一行,否则什么都不做?
【发布时间】:2012-01-07 04:01:18
【问题描述】:

我有一个总是有 0 或 1 行的表。我想编写一个脚本,如果它是空的,它将插入一行,如果有一行则什么都不做。我试过这个:

SELECT * CASE WHEN (SELECT COUNT(*) FROM table < 0)
   THEN (INSERT INTO table (a, b, c, d) VALUES ('a', 'b', 'c', 'd'))
   END CASE
FROM table;

但我明白了:

在预期的地方找不到 FROM 关键字。

这看起来应该很简单我做错了什么?

【问题讨论】:

  • 注意 如果您没有设置其他约束。两个单独的会话都可以查询您的表,发现它为空,然后插入一行,每个会话产生两行。为了防止这种情况发生,请在表上设置一个主键,并为该 PK 分配一个检查约束,以便它只能有一个值:create table t (PK number constraint t_pk primary key constraint T_CK1 check (PK = 1) . . .)

标签: sql oracle


【解决方案1】:

您可以将查询重组为 select/insert 并使用 not exists 关键字检查表是否为空,如下所示:

insert table (a, b, c, d)
select 'a', 'b', 'c', 'd'
from dual
where not exists (select 1 from table)

或者,如果它需要是 if 语句,类似地:

if not exists (select 1 from table)
    insert table (a, b, c, d) values ('a', 'b', 'c', 'd')

【讨论】:

  • 这对我不起作用:INSERT INTO mytable (a, b, c, c) SELECT 'a' b, 'c', 'd' FROM mytable WHERE NOT EXISTS (SELECT 1 FROM表);它从不插入一行,即使表有 0 行。
  • @user1134858: 使用dual 这样当myTable 为空时你会得到一行。请参阅我对此答案所做的编辑。
  • 这个答案似乎使用的是 SQL Server 语法,而不是 Oracle。第一个查询需要from 子句。与 SQL Server 不同,Oracle 不支持没有fromselectif 语句不是有效的 PL\SQL。缺少thenend if 关键字。而PL/SQL 不支持not exists 比较部分if 语句。在 PL\SQL 中,需要创建并填充一个用于保存计数的变量,然后 if 将针对 &lt;&gt; 0 进行测试。
  • @ShannonSeverance 我的回答早于在问题中添加“oracle”标签,这就是为什么
【解决方案2】:

使用带有 INSERT 但没有 UPDATE 的 MERGE 语句

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多