使用包含串行字段的表创建模式

时间:2017-01-22 01:58:06

标签: sql postgresql

如何在(在单个SQL命令中)创建一个模式和一个表,但是包含一个串行列的表(在Postgres中)?

例如,我在这里尝试使用序列为zoo的{​​{1}}类型的表animals创建架构animal_t

animal_id

注意:

  • DROP TYPE IF EXISTS animal_t CASCADE; CREATE TYPE animal_t AS ( animal_id integer, animal_name varchar ); CREATE SCHEMA zoo CREATE TABLE animals OF animal_t animal_id WITH OPTIONS NOT NULL DEFAULT nextval('animals_animal_id_seq') CREATE SEQUENCE animals_animal_id_seq OWNED by animals.animal_id ; 只接受CREATE SCHEMACREATE TABLE,它不接受CREATE SEQUENCE,这就是为什么我必须在一个SQL句子中完成所有这些操作。

结果:

ALTER

2 个答案:

答案 0 :(得分:1)

您有两个选择

  1. 简化您的陈述并摆脱对象类型
  2. CREATE SCHEMA zoo
      CREATE table animal
      (
        animal_id    serial,
        animal_name  varchar
      );
    
    1. 如果要避免在表格前添加模式名称,请使用搜索路径:
    2. DROP TYPE IF EXISTS animal_t CASCADE;
      CREATE TYPE animal_t AS (
          animal_id           integer,
          animal_name         varchar
      );
      
      CREATE SCHEMA zoo;
      set search_path = zoo;
      
      CREATE SEQUENCE animals_animal_id_seq;
      
      CREATE TABLE animals OF animal_t 
              animal_id WITH OPTIONS NOT NULL DEFAULT nextval('animals_animal_id_seq');
      alter sequence animals_animal_id_seq owned by animals.animal_id;
      

      创建类型和模式后,当前模式将设置为刚刚创建的模式,因此所有后续语句都使用zoo作为默认模式。

      请注意,如果这是您使用“扩展”创建架构语法的另一个原因,则可以在单个事务中执行此操作。

答案 1 :(得分:0)

我认为以下应该这样做。我们的想法是ALTER schema_name.thing

CREATE SCHEMA zoo
  CREATE TABLE animals OF animal_t ( animal_id WITH OPTIONS NOT NULL )
;
CREATE SEQUENCE zoo.animals_animal_id_seq OWNED BY zoo.animals.animal_id;
ALTER TABLE zoo.animals ALTER animal_id SET DEFAULT nextval('zoo.animals_animal_id_seq');