1.语法规范

插入数据语法

# 标准形式
insert into <表名> (列1, 列2, 列3, ...) values (值1, 值2, 值3, ...);
# 插入单条完整字段数据,可以省略字段列表
insert into <表名> values (值1, 值2, 值3, ...);
# 批量插入
insert into <表名> values (值1, 值2, 值3, ...),(值1, 值2, 值3, ...)...;

实际操作

# 创建表
create table product_ins(
	product_id char(4) not null,
    product_name varchar(100) not null,
    product_type varchar(32) not null,
    sale_price integer default 0,
    purchase_price integer,
    regist_date date,
    primary key (product_id)
);

sale_price未insert数值时,会自动使用默认值0。

2.插入数据情况

2.1 insert语句标准语法

# 插入单条完整数据
insert into product_ins (product_id, product_name, product_type,sale_price,purchase_price,regist_date) values ('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20');

shop=# select * from product_ins;
 product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------
 0001       | T恤衫        | 衣服         |       1000 |            500 | 2009-09-20

注意: 字符串类型使用单引号括起来。

当列清单和值清单,字段数目不对应的时候,是无法插入数据的。

# 字段列表和数值列表不一致的情况
insert into product_ins (product_id, product_name, product_type,sale_price,purchase_price,regist_date) values ('0001', 'T恤衫', '衣服', 1000, 500);
# 会提示如下错误
ERROR:  INSERT has more target columns than expressions
第1行...duct_name, product_type,sale_price,purchase_price,regist_dat...

2.2 批量插入数据

上面的三条插入语句,可以合并成一条插入语句

# 三条单条insert数据
insert into product_ins values ('0002', '打孔器', '办公用品', 500, 320, '2009-09-11');
insert into product_ins values ('0003', '运动T恤', '衣服', 4000, 2800, null);
insert into product_ins values ('0004', '菜刀', '厨房用具', 3000, 28000, null);

# 批量插入语句,等效于insert语句
insert into product_ins values ('0002', '打孔器', '办公用品', 500, 320, '2009-09-11'),('0003', '运动T恤', '衣服', 4000, 2800, null),('0004', '菜刀', '厨房用具', 3000, 28000, null);
shop=# select * from product_ins;
 product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------
 0001       | T恤衫        | 衣服         |       1000 |            500 | 2009-09-20
 0002       | 打孔器       | 办公用品     |        500 |            320 | 2009-09-11
 0003       | 运动T恤      | 衣服         |       4000 |           2800 |
 0004       | 菜刀         | 厨房用具     |       3000 |          28000 |

简写形式的insert语句

当insert语句中字段列表和表字段列表一致的时候,此时可以省略字段列表,只写值

# 单条完整情况
insert into product_ins (product_id, product_name,
product_type,sale_price,purchase_price,regist_date) values ('0005', '高压锅', '厨房用品', 6800, 5000, '2009-01-15');

# 简写情况
insert into product_ins  values ('0005', '高压锅', '厨房用品', 6800, 5000, '2009-01-15');

2.3 插入null值

在执行sql语句过程中,当字段没有指定not null的情况时,当不确定目前字段对应值的情况下,可以暂时先使用null字段,后续在补充数据情况。

# purchase_price设定为null
insert into product_ins (product_id, product_name,
product_type,sale_price,purchase_price,regist_date) values ('0006', '叉子', '厨房用具', 500, null, '2009-01-15');
shop=# select * from product_ins where product_id = '0006';
 product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------
 0006       | 叉子         | 厨房用具     |        500 |                | 2009-01-15

2.4 插入默认值

  1. 使用关键字defalut可以代指字段的默认值
  2. 通过缺省字段,隐式设置成默认值
# 使用default关键字显示插入默认值
insert into product_ins (product_id, product_name,
product_type,sale_price,purchase_price,regist_date) values ('0007', '擦菜板', '厨房用具', default, 790, '2009-04-28');

shop=# select * from product_ins where product_id = '0007';
 product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------
 0007       | 擦菜板       | 厨房用具     |          0 |            790 | 2009-04-28
 
# 删除数据 
delete from product_ins where product_id = '0007';

# 通过缺省字段,隐式插入默认值
insert into product_ins (product_id, product_name,
product_type,purchase_price,regist_date) values ('0007', '擦菜板', '厨房用具', 790, '2009-04-28');
shop=# select * from product_ins where product_id = '0007';
 product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------
 0007       | 擦菜板       | 厨房用具     |          0 |            790 | 2009-04-28