如何让表中另一列具备IDENTITY列特性,INSERT时无需显式指定值?
你描述里的插入语句表名test、列名foo应该是笔误,实际对应你创建的foo表和bar字段。
你当前的建表语句已经给insertion_date配置了DEFAULT current_timestamp约束,id是IDENTITY自增列,二者本身都支持插入时不显式传值。你无法直接使用insert into foo values('placeholder')的核心原因是:不带列名的INSERT语句要求传入的值的数量必须和表的总列数完全匹配,你的表总共有3列,只传1个值必然会触发报错。
要实现需求可以用以下两种方案:
方案1:指定插入列名(最推荐)
这是SQL开发的最佳实践,兼容性、可维护性更强,即使后续表结构调整加列,原有插入逻辑也不会受影响,你当前的表结构直接支持该写法,不需要修改任何表配置:
INSERT INTO foo (bar) VALUES ('placeholder');
方案2:强制使用不带列名的插入写法
如果必须使用不带列名的语法,有两种实现方式:
- 方式A:用
DEFAULT关键字给自增、有默认值的列占位,对应插入语句:
INSERT INTO foo VALUES (DEFAULT, 'placeholder', DEFAULT);
- 方式B:创建仅包含需要手动传值列的视图,后续对视图执行插入:
-- 建视图,仅包含需要手动赋值的bar列 CREATE VIEW v_foo AS SELECT bar FROM foo; -- 直接对视图插入,不需要指定列名 INSERT INTO v_foo VALUES ('placeholder');
注意
生产环境不建议使用不带列名的INSERT语法,只要后续表结构新增字段,所有这类插入语句都会直接报错,维护成本极高。
内容的提问来源于stack exchange,提问作者David Riscanevo
相关产品推荐
相关产品推荐

