仅在选择返回有效行时,仅插入到表中
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”,这就是它失败的原因。以上是关于仅在选择返回有效行时,仅插入到表中的主要内容,如果未能解决你的问题,请参考以下文章
如何仅在单击网格中的复选框而不是单击单元格或行时选择复选框在 extjs 3.2
我想将表单中的数据插入到表中,然后从另一个表中选择另一个数据并使用 PHP 插入到第三个表中