可以在 VALUES 中没有行的情况下插入吗?
Possible to INSERT with no rows in VALUES?
我知道这个问题可能有点深奥,但是是否可以创建一个带有 VALUES
没有值的子句的 INSERT
语句?
INSERT myTable
(col1, col2)
VALUES
<no values>
我正在以编程方式生成 INSERT
语句,我可以通过进行不会生成 INSERT
的 IF
检查来解决这个问题,但我很好奇这个 VALUES
语句可以被认为是一个集合。集合可能是空的...
文档中没有提及空集:
Table Value Constructor
您可以用默认数据填充列。对于 int 可能是 0,对于文本可能是空字符串等等。否则,您可以使列可为空并用空值填充它们。这取决于你定义什么为空。
简而言之,您的代码很好,只是您使用的是伪代码。它应该是这样的:
INSERT into myTable
(col1, col2)
VALUES
(null, null)
只要您的列设置为接受 NULL,这就可以很好地工作
您可能需要考虑在其中设置一个自动递增 ID 字段,以便稍后识别这些新行。
可以通过 select 语句生成插入。
INSERT INTO myTable (col1, col2)
SELECT FROM otherTable WHERE condition
如果select returns没有行,则不插入记录,也不抛出异常。顺便提一句。在更大的记录数上,这比创建单行插入语句要快得多。
集合论识别空集但插入值不识别
几个可能的选项:
插入空值并有一个插入触发器使插入
无效
插入空值并有一个排除它们的视图
我能想到的唯一用例是您想要向前读取大型数据流并在记录末尾知道是否有要插入的值。您可以将 'insert values' 重写为 'insert into select' 并在末尾添加一个条件以防止插入。
insert into myTable(col1, col2)
select null, null
where 1 = 2
没有简单的语法解决方案,但您可以通过使行生成器稍微复杂一些来解决此问题。
您可以重写生成行的部分,用一组
替换 VALUES 构造函数
SELECT <i>values</i>
UNION ALL
SELECT <i>values</i>
UNION ALL
...
包括强制性的 SELECT 这种类型:
SELECT NULL, NULL, ... WHERE 1 <> 1
在开头或结尾。该强制项不会产生任何行,如果它恰好是唯一的元素,那么整个联合将不会产生任何行,INSERT 语句也不会插入任何内容。
如果出于某种原因 VALUES 构造函数更可取,您可以修改您的生成器以包含一个 (NULL, NULL, ...)
项并在构造函数周围包装一个查询:
INSERT INTO
<i>target_table</i> (<i>target_columns</i>)
SELECT
*
FROM
(VALUES
(...),
...
(NULL, ...) -- obligatory element
) AS v (<i>column_names</i>)
WHERE
<i>some_of_the_columns</i> IS NOT NULL
;
其中 some_of_the_columns
应在永远无法生成 NULL
的列中选择。同样,如果 (NULL, ...)
行恰好是 VALUES 中唯一生成的行,则生成的查询将不插入任何内容。
我知道这个问题可能有点深奥,但是是否可以创建一个带有 VALUES
没有值的子句的 INSERT
语句?
INSERT myTable
(col1, col2)
VALUES
<no values>
我正在以编程方式生成 INSERT
语句,我可以通过进行不会生成 INSERT
的 IF
检查来解决这个问题,但我很好奇这个 VALUES
语句可以被认为是一个集合。集合可能是空的...
文档中没有提及空集: Table Value Constructor
您可以用默认数据填充列。对于 int 可能是 0,对于文本可能是空字符串等等。否则,您可以使列可为空并用空值填充它们。这取决于你定义什么为空。
简而言之,您的代码很好,只是您使用的是伪代码。它应该是这样的:
INSERT into myTable
(col1, col2)
VALUES
(null, null)
只要您的列设置为接受 NULL,这就可以很好地工作 您可能需要考虑在其中设置一个自动递增 ID 字段,以便稍后识别这些新行。
可以通过 select 语句生成插入。
INSERT INTO myTable (col1, col2)
SELECT FROM otherTable WHERE condition
如果select returns没有行,则不插入记录,也不抛出异常。顺便提一句。在更大的记录数上,这比创建单行插入语句要快得多。
集合论识别空集但插入值不识别
几个可能的选项:
插入空值并有一个插入触发器使插入
无效
插入空值并有一个排除它们的视图
我能想到的唯一用例是您想要向前读取大型数据流并在记录末尾知道是否有要插入的值。您可以将 'insert values' 重写为 'insert into select' 并在末尾添加一个条件以防止插入。
insert into myTable(col1, col2)
select null, null
where 1 = 2
没有简单的语法解决方案,但您可以通过使行生成器稍微复杂一些来解决此问题。
您可以重写生成行的部分,用一组
替换 VALUES 构造函数SELECT <i>values</i>
UNION ALL
SELECT <i>values</i>
UNION ALL
...
包括强制性的 SELECT 这种类型:
SELECT NULL, NULL, ... WHERE 1 <> 1
在开头或结尾。该强制项不会产生任何行,如果它恰好是唯一的元素,那么整个联合将不会产生任何行,INSERT 语句也不会插入任何内容。
如果出于某种原因 VALUES 构造函数更可取,您可以修改您的生成器以包含一个 (NULL, NULL, ...)
项并在构造函数周围包装一个查询:
INSERT INTO
<i>target_table</i> (<i>target_columns</i>)
SELECT
*
FROM
(VALUES
(...),
...
(NULL, ...) -- obligatory element
) AS v (<i>column_names</i>)
WHERE
<i>some_of_the_columns</i> IS NOT NULL
;
其中 some_of_the_columns
应在永远无法生成 NULL
的列中选择。同样,如果 (NULL, ...)
行恰好是 VALUES 中唯一生成的行,则生成的查询将不插入任何内容。