【问题标题】:PostgreSQL: Conditional insert default valuesPostgreSQL:条件插入默认值
【发布时间】:2017-12-19 20:36:39
【问题描述】:

我们如何有条件地将具有默认值的行插入到表中?

例如,我们有一个一列的表。

CREATE TABLE foo (
    id bigserial PRIMARY KEY
);

而且,我们想做如下的事情:

INSERT INTO foo DEFAULT VALUES
WHERE random() >= 0.5;

但是,我们得到:

ERROR:  syntax error at or near "WHERE"

【问题讨论】:

  • 我相信你有一个理由,但这似乎是一件奇怪的事情。出于好奇,您希望通过这样做来完成什么?

标签: postgresql sql-insert auto-increment


【解决方案1】:

条件插入需要查询,从INSERT documentation 可以看出,queryDEFAULT VALUES 位于一个独占组中。

当明确定义应该填充哪些列时,您至少需要指定一个。所以这样的东西也是无效的:

INSERT INTO foo ()
SELECT 1
WHERE random() >= 0.5;

我能想到的实现相同效果的唯一方法是显式定义“默认”值:

INSERT INTO foo (id)
SELECT nextval('foo_id_seq'::regclass)
WHERE random() > 0.8;

或者通过添加另一列

CREATE TABLE foo (
    id bigserial PRIMARY KEY,
    ignored SMALLINT
);

INSERT INTO foo (ignored) 
SELECT 1
WHERE random() >= 0.5;

编辑:

完全错过了你可以做空选择:

INSERT INTO foo
SELECT
WHERE random() >= 0.5;

【讨论】:

    【解决方案2】:
    INSERT INTO foo
    SELECT -- here is empty select, without any columns
    WHERE random() >= 0.5;
    

    Demo

    PS:PostgreSQL 中有几个“奇怪”相关的东西。例如,select; 甚至更多的create table t(); 都是有效的语句。

    【讨论】:

      猜你喜欢
      • 2018-10-04
      • 2013-01-14
      • 1970-01-01
      • 2011-07-20
      • 2019-02-25
      • 2015-05-24
      • 1970-01-01
      • 2018-03-21
      • 2015-11-11
      相关资源
      最近更新 更多