SQL如何为表B每一行在仅含Id列的表A插入默认值记录?
批量插入自动生成Id默认记录的实现方法
场景回顾
- 表A仅包含
Id单列,Id为自动生成(自增/序列/默认值生成),单条插入默认记录的语句为INSERT INTO A DEFAULT VALUES - 需求是按表B的总行数,为每一行B表记录对应在A表插入一条Id自动生成的默认记录
- 常规跨表字段映射插入的写法不适配当前场景,直接写
INSERT INTO A SELECT Id FROM B会把B表的Id值写入A表,无法触发Id自动生成,不符合预期
正确写法
标准SQL兼容写法(适配PostgreSQL、SQL Server、SQLite等支持DEFAULT关键字的数据库):
INSERT INTO A (Id) SELECT DEFAULT FROM B;
针对MySQL等将自增列NULL值触发自动生成作为默认逻辑的数据库,也可使用简写:
INSERT INTO A SELECT NULL FROM B;
逻辑说明
- 上述写法的执行效果和逐行执行
INSERT INTO A DEFAULT VALUES完全一致,最终插入A表的记录数和B表现有总行数相等,所有Id均为新生成的自动值,不会读取、写入B表的Id字段 - 错误写法的核心问题是SELECT子句返回了B表的Id值,数据库会直接把该值作为A表Id写入,跳过自动生成逻辑
内容的提问来源于stack exchange,提问作者carl kenne
相关产品推荐
相关产品推荐

