簡體   English   中英

具有DEFAULT值的多行條件插入

[英]Multi-row conditional insert with DEFAULT values

這是我要在表中插入多行的PostgreSQL查詢的簡化版本:

INSERT INTO my_table (a, b, datasource)
VALUES
  ('foo', 'bar', 'my source'),
  ('foo', DEFAULT, 'my source'),
  (DEFAULT, 'bar', 'my source');

注意, DEFAULT值可能出現在ab列中。

這樣做很好,但是我只想插入滿足某些條件的行,此外,刪除重復的值對於所有要插入的行都是恆定的,這將是很好的。

因此,我嘗試將其更改為以下內容:

INSERT INTO my_table (a, b, datasource)
SELECT v.*, 'my source'
FROM (VALUES ('foo', 'bar'), ('foo', DEFAULT), (DEFAULT, 'bar')) AS v (a, b)
WHERE v.a = 'foo';

這導致錯誤: DEFAULT is not allowed in this context

我該如何解決?

可能值得注意的是,實際上, WHERE條件實際上很復雜,並且涉及其他表。 此外,一次要插入幾千行,並以編程方式生成值表達式。 可以這樣做,以便輸出表的字面默認值而不是DEFAULT ,但是這需要在數據庫之外對它們進行硬編碼,這是我想避免的(因為如果我在數據庫中更改了它們而忘記更新硬編碼的話)值,將導致問題)。

由於找不到任何更優雅的方法(如當前缺乏其他答案所證明),我最終使用了建議,首先將值插入到臨時表中。 PostgreSQL使使用相同的默認值創建一個“克隆”表( 使用LIKE關鍵字 )變得非常容易,但沒有其他一些不必要的東西:

CREATE TEMPORARY TABLE temp_table (
  LIKE my_table INCLUDING DEFAULTS
);

INSERT INTO temp_table (a, b)
VALUES
  ('foo', 'bar'),
  ('foo', DEFAULT),
  (DEFAULT, 'bar');

然后,只需使用臨時表代替之前的VALUES子句即可:

INSERT INTO my_table (a, b, datasource)
SELECT a, b, 'my source'
FROM temp_table
WHERE a = 'foo';

一個小警告是您無法避免將NOT NULL約束復制到臨時表中。 例如,如果datasourceNOT NULL (並且沒有默認值),則必須在第一個INSERT查詢中添加值(或占位符),或刪除該列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM