如何在(在单个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 SCHEMA
或CREATE TABLE
,它不接受CREATE SEQUENCE
,这就是为什么我必须在一个SQL句子中完成所有这些操作。 结果:
ALTER
答案 0 :(得分:1)
您有两个选择
CREATE SCHEMA zoo
CREATE table animal
(
animal_id serial,
animal_name varchar
);
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');