PostgreSQL:条件插入默认值
PostgreSQL: Conditional insert default values
我们如何有条件地将具有默认值的行插入 table?
例如,我们有一个只有一列的 table。
CREATE TABLE foo (
id bigserial PRIMARY KEY
);
而且,我们想做如下的事情:
INSERT INTO foo DEFAULT VALUES
WHERE random() >= 0.5;
但是,我们得到:
ERROR: syntax error at or near "WHERE"
条件插入需要查询,从INSERT documentation可以看出,query
和DEFAULT VALUES
是排他组的。
明确定义应填充哪些列时,您需要至少指定一列。所以这样的东西也是无效的:
INSERT INTO foo ()
SELECT 1
WHERE random() >= 0.5;
我能想到的实现相同效果的唯一方法是显式定义 "default" 值:
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;
INSERT INTO foo
SELECT -- here is empty select, without any columns
WHERE random() >= 0.5;
PS:PostgreSQL中有几个"curious"相关的东西。例如,select;
甚至更多 create table t();
都是有效的语句。
我们如何有条件地将具有默认值的行插入 table?
例如,我们有一个只有一列的 table。
CREATE TABLE foo (
id bigserial PRIMARY KEY
);
而且,我们想做如下的事情:
INSERT INTO foo DEFAULT VALUES
WHERE random() >= 0.5;
但是,我们得到:
ERROR: syntax error at or near "WHERE"
条件插入需要查询,从INSERT documentation可以看出,query
和DEFAULT VALUES
是排他组的。
明确定义应填充哪些列时,您需要至少指定一列。所以这样的东西也是无效的:
INSERT INTO foo ()
SELECT 1
WHERE random() >= 0.5;
我能想到的实现相同效果的唯一方法是显式定义 "default" 值:
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;
INSERT INTO foo
SELECT -- here is empty select, without any columns
WHERE random() >= 0.5;
PS:PostgreSQL中有几个"curious"相关的东西。例如,select;
甚至更多 create table t();
都是有效的语句。