我知道这个问题可能有点深奥,但无论如何都可以用INSERT
语句创建一个没有值的VALUES
语句吗?
INSERT myTable
(col1, col2)
VALUES
<no values>
我正在以编程方式生成INSERT
语句,我可以通过IF
检查来解决此问题,但不会生成INSERT
,但我很好奇这个VALUES
语句可以被认为是一个集合。套可能是空的......
文档中没有提到有关空集的内容: Table Value Constructor
答案 0 :(得分:3)
没有简单的语法解决方案,但您可以通过使行生成器更复杂来解决此问题。
您可以重写生成行的部分,用一组
替换VALUES构造函数SELECT values
UNION ALL
SELECT values
UNION ALL
...
包括这种强制性选择:
SELECT NULL, NULL, ... WHERE 1 <> 1
在开始或结束时。该强制项将不会产生任何行,如果它恰好是唯一的元素,那么整个联合将不会产生任何行,INSERT语句将不会插入任何行。
如果VALUES构造函数由于某种原因是可取的,您可以修改生成器以包含(NULL, NULL, ...)
项并围绕构造函数包装查询:
INSERT INTO
target_table (target_columns)
SELECT
*
FROM
(VALUES
(...),
...
(NULL, ...) -- obligatory element
) AS v (column_names)
WHERE
some_of_the_columns IS NOT NULL
;
其中 some_of_the_columns
应从无法生成NULL
的列中选择。同样,如果(NULL, ...)
行碰巧是VALUES中唯一生成的行,则生成的查询将不会插入任何内容。
答案 1 :(得分:2)
我可以想象的唯一用途就是你想通过一个大型数据流向前读取,并在记录的末尾知道是否有值要插入。您可以重写“插入值”&#39;插入选择&#39;并在最后添加一个条件,以防止插入。
insert into myTable(col1, col2)
select null, null
where 1 = 2
答案 2 :(得分:1)
Set theory识别空集但插入值不
偶然可能的选择:
插入空值并使插入触发器使插入件无效
插入空值并有一个排除它们的视图
答案 3 :(得分:0)
简而言之,除了使用伪代码之外,您的代码很好。这应该是它的样子:
INSERT into myTable
(col1, col2)
VALUES
(null, null)
只要您的列设置为接受NULL,这将完全正常 您可能需要考虑在其中获取自动增量ID字段,以便稍后识别这些新行。
答案 4 :(得分:0)
可以通过select语句生成插入。
INSERT INTO myTable (col1, col2)
SELECT FROM otherTable WHERE condition
如果select返回no row,则不会插入任何记录,也不会抛出异常。顺便说一句。在更大的记录计数上,这比创建单行插入语句要快得多。
答案 5 :(得分:-2)
您可以使用默认数据填充列。对于int可能为0,对于文本可能为空字符串,依此类推。否则,您可以使列可以为空并用空值填充它们。这取决于你定义为空的内容。