常用SQL语句常见建表建索引等DDL语句(PGSQL)

Posted 石头StoneWang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用SQL语句常见建表建索引等DDL语句(PGSQL)相关的知识,希望对你有一定的参考价值。

背景

pgsql常见DDL语句,怎么建主键,怎么建索引,建表时自动建sequence,查询某个表是否存在,某个表是否存在某个字段,某个索引是否存在,查主键的名字

查 “是否存在”

  • 获得当前数据库(catalog)和schema

    --使用这两个函数
    select current_database();
    select current_schema();
    
  • 查schema下有什么表

    --查询当前schema下有什么表(方法一)
    select * from pg_tables where schemaname=current_schema();
    
    -- 查询当前schema下有什么表(方法二)
    SELECT *
    FROM information_schema.tables
    WHERE table_catalog=current_database() and table_schema = current_schema();
    
    -- 判断表是否存在(方法一)
    select tablename from pg_tables where schemaname=current_schema() and tablename='communication'
    
    -- 判断表是否存在(方法二)
    SELECT table_name
    FROM information_schema.tables
    WHERE table_catalog=current_database() and table_schema=current_schema() and table_name='communication'
    
  • 查表有什么字段

    -- 查询表有什么列(字段信息,含类型等等)
    SELECT *
    FROM information_schema.columns
    WHERE table_catalog=current_database() and table_schema = current_schema() and table_name = 'communication';
    
    -- 判断某列是否存在
    SELECT column_name
    FROM information_schema.columns
    WHERE table_catalog=current_database() and table_schema = current_schema() and table_name = 'communication'and column_name='dr';
    
  • 查表有什么索引

    --查询表有什么索引
    SELECT *
    FROM pg_indexes
    WHERE schemaname = current_schema() AND tablename = 'communication';
    
    --判断索引是否存在
    SELECT indexname
    FROM pg_indexes
    WHERE schemaname = current_schema() AND tablename = 'communication' AND
    indexname = 'idx_table_name';
    
  • 查主键的名字(含是否存在主键)

    --判断主键名字是什么,查无记录表示无主键(改一下relname的值,contype不需要改,p表示主键)
    SELECT
        pg_constraint.conname AS pk_name
    FROM
        pg_constraint
    INNER JOIN pg_class ON pg_constraint.conrelid = pg_class.oid
    WHERE
        pg_class.relname = 'my_table'
    AND pg_constraint.contype = 'p';
    

DDL

  • 建表、删表 DDL(含自动创建sequence)

    --建表(幂等)【不指定主键的名字】
    --【主键默认是 "表名_pkey",即 my_table_pkey】
    --【serial或者serial8分别表示int4和int8的,这种写法会自动建sequence,且名字是 "表名_id_seq",删除表的时候会级联删除该序列】
    CREATE TABLE IF NOT EXISTS "my_table"
    (
      "id"               SERIAL       NOT NULL,
      "file_id"          varchar(255) NOT NULL,
      "file_name"        varchar(255) NOT NULL,
      "dr"               int2 DEFAULT 0,
      PRIMARY KEY ("id")
    );
    
    --建表(幂等)【指定主键的名字】
    CREATE TABLE IF NOT EXISTS "my_table2"
    (
      "id"               SERIAL       NOT NULL,
      "file_id"          varchar(255) NOT NULL,
      "file_name"        varchar(255) NOT NULL,
      "dr"               int2 DEFAULT 0,
      CONSTRAINT "custom_name_of_my_table2" PRIMARY KEY ("id")
    );
    
    --删表(幂等)
    drop table if exists "data_oss_upload";
    
  • 列(增删改列)

    --新增列(无法重复执行,无法判断是否已经存在)
    alter table "communication" add COLUMN table_name varchar(512);
    
    --删除列(无法重复执行,无法判断字段是否已存在)
    alter table "communication" drop column dr;
    
    
    --修改列类型和精度(可重复执行,只能修改列类型)
    alter table "communication" alter column table_name type varchar(500);
    
    --修改列名(不可重复执行,修改列名要用这个)
    alter table "communication" rename column table_name to table_name2;
    
    --列名和类型一起修改,结合用上面2句即可,貌似没一句话干两样的
    
  • 注释

    --对表注释(可重复执行,但需要表存在)
    COMMENT ON TABLE "communication" IS '通信表';
    
    --对列注释(可重复执行,但需要表、列存在)
    COMMENT ON COLUMN "communication"."id" IS '自增主键';
    
  • 索引

    --建普通索引(幂等)
    CREATE INDEX IF NOT EXISTS "idx_table_name" ON "communication" USING btree (
      "table_name" COLLATE "pg_catalog"."default" "pg_catalog"."bpchar_ops" ASC NULLS LAST
    );
    
    --建唯一索引(幂等)
    create unique index IF NOT EXISTS data_app_api_app_id_api_no on data_app_api (app_id,api_no);
    
    --删除索引(幂等)
    drop INDEX IF EXISTS "idx_table_name";
    
    --修改索引:先删后增即可
    
  • 约束(注意别把 CONSTRAINT 写成复数)

    感觉有部分的约束其实是可以使用index来表示的,使用index以便实现幂等

    --新增唯一约束(应该就是唯一索引的另外一种写法)
    ALTER TABLE "communication" ADD CONSTRAINT "idx_communication_only" UNIQUE ("ds_id", "table_name", "tenant_id");
    --貌似等价于
    create unique index IF NOT EXISTS "idx_communication_only" on "communication" ("ds_id", "table_name", "tenant_id");
    
    --新增普通约束(非唯一,也相当于索引)
    ALTER TABLE "communication" ADD CONSTRAINT "idx_communication_only"("ds_id", "table_name", "tenant_id");
    
  • 主键

    • 表已经建好了,如何新增、修改、删除主键

      --新增主键。不指定主键的名字,默认是"表名_pkey",即 my_table_pkey 【不指定主键名字】
      ALTER TABLE "my_table" ADD PRIMARY KEY(id,minute);
      
      --新增主键。指定主键的名字(注意不要写错 ADD CONSTRAINTS)【指定主键名字】
      ALTER TABLE "my_table" ADD CONSTRAINT custom_name_of_my_table6666 PRIMARY KEY (id);
      
    • 新建表的时候顺带建主键

      --创建表的顺带创建主键【不指定主键的名字,默认是 "表名_pkey",即 my_table_pkey】
      CREATE TABLE IF NOT EXISTS "my_table"
      (
        "id"               SERIAL       NOT NULL,
        "file_id"          varchar(255) NOT NULL,
        "file_name"        varchar(255) NOT NULL,
        "dr"               int2 DEFAULT 0,
        PRIMARY KEY ("id")
      );
      
      --创建表的顺带创建主键  【指定主键的名字】
      CREATE TABLE IF NOT EXISTS "my_table2"
      (
        "id"               SERIAL       NOT NULL,
        "file_id"          varchar(255) NOT NULL,
        "file_name"        varchar(255) NOT NULL,
        "dr"               int2 DEFAULT 0,
        CONSTRAINT "custom_name_of_my_table2" PRIMARY KEY ("id")
      );
      
    • 删除主键(不知道主键名删不了)

      --删除主键【知道名字的情况下】
      ALTER TABLE "my_table" DROP CONSTRAINT IF EXISTS my_cons;
      
      --主键名的情况下似乎删不了(可以查主键叫什么名)
      
  • 创建序列(sequence)

    --创建序列(幂等)【指定从某个值开始】
    CREATE SEQUENCE IF NOT EXISTS api_no START 10000;
    

以上是关于常用SQL语句常见建表建索引等DDL语句(PGSQL)的主要内容,如果未能解决你的问题,请参考以下文章

获取MySQL中某个数据库下所有表建表语句的DDL

ClickHouse 创建数据库/建表/视图/字典 SQL

SQL语法精讲(包括建库建表建视图查询增加删除)

oracle ddl语句用啥编辑

求SQL语句建表建字段详细说明(access)

【求助】oracle中sql语句 此列列表已索引的解决办法