Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

插入/删除 行

INSERT 插入

  • 全字段

    INSERT INTO public.table_name
    VALUES ('11', 'cn', '0');
    
    INSERT INTO public.table_name
    VALUES ('11', 'cn', DEFAULT);
    
  • 部分字段

    INSERT INTO public.table_name
    (column1, column2)
    VALUES ('11', 'cn');
    
  • 部分字段 + 批量

    INSERT INTO public.table_name (column1, column2)
    VALUES ('11', 'cn'), ('21', 'non_cn');
    
  • 部分字段 + 批量 + 可能冲突插入处理

    INSERT INTO public.table_name (column1, column2)
    VALUES ('11', 'cn'), ('21', 'non_cn')
    ON CONFLICT (column1)
    DO UPDATE SET column2 = EXCLUDED.column2;
    
    • ON CONFLICT
      • 若已经存在一行数据的column1值,就是想要插入的值,则发生冲突,一般无法插入
      • 如果不想做任何更新,则后面接DO NOTHING
      • 如果想更新已有的,则后面接DO UPDATE SET 其他列 = 新的值
    • EXCLUDED
      • 代指新插入的冲突数据构造出来的伪表,用来引用做更新

DELETE 删除

  • 单表内删除

    DELETE FROM public.table_name
    WHERE column1 = 待查值;
    
    • 一定要带上WHERE,否则很危险(会把整个表数据都删了)
    • 执行成功后,默认会返回删除的数量
      • 可以最后加上RETURNING *,返回删除的所有行的详细信息
  • 借用其他表删除(USING)

    DELETE FROM films USING producers
    WHERE producer_id = producers.id AND producers.name = 'foo';
    
    • 从producers中取出name为foo的所有id,删除films中对应id的行
    • 也可用子查询来实现
      DELETE FROM films
      WHERE producer_id IN (SELECT id FROM producers WHERE name = 'foo');