仅在选择返回有效行时,仅插入到表中

Posted

技术标签:

【中文标题】仅在选择返回有效行时,仅插入到表中【英文标题】:Insert into table from select only when select returns valid rows 【发布时间】:2019-08-16 23:32:04 【问题描述】:

我想从 select 语句中插入到表中,但要求插入仅在 select 返回有效行时发生。如果选择没有返回任何行,则不会发生插入。

insert into products (name, type) select 'product_name', type from prototype where id = 1

但是,即使 select 没有返回任何行,上面的 sql 也会插入。 它尝试插入 NULL 值。

我知道下面的sql可以检查行是否存在

select exists (select true from prototype where id = 1)

如何编写单条SQL来添加上述条件插入排除情况?

【问题讨论】:

SELECT 没有返回行时,不会插入任何行。您确定这种行为吗?你能在 SQL Fiddle 中重现这个案例吗? 错误消息如下:错误:“类型”列中的空值违反非空约束详细信息:失败行包含(14320244,产品,空,2019-08-16 23:38:52.772977) . SQL状态:23502 【参考方案1】:

您插入的方式错误。请参见下面的示例,它不会插入任何行,因为没有匹配 id = 1

create table products (
  name varchar(10),
  type varchar(10)
);

create table prototype (
  id int,
  name varchar(10),
  type varchar(10)
);

insert into prototype (id, name, type) values (5, 'product5', 'type5');  
insert into prototype (id, name, type) values (7, 'product7', 'type7');

insert into products (name, type) select name, type from prototype where id = 1
-- no rows were inserted.

【讨论】:

我更新了我在问题描述中使用的sql。我在选择中使用了硬编码的“product_name”,这就是它失败的原因。

以上是关于仅在选择返回有效行时,仅插入到表中的主要内容,如果未能解决你的问题,请参考以下文章

使用函数调用从选择中插入到表的 Oracle 中的性能

如何仅在单击网格中的复选框而不是单击单元格或行时选择复选框在 extjs 3.2

我想将表单中的数据插入到表中,然后从另一个表中选择另一个数据并使用 PHP 插入到第三个表中

PHP mysqli_fetch_array() 不会在 while 循环中将所有选择查询插入到表中

我可以在存储过程中使用 if 语句将值插入到表中吗?

Ajax发布仅返回多个选择框的第一个值[关闭]