Postgresql创建一个包含表格的模式

时间:2015-04-17 04:03:25

标签: postgresql

这是我的剧本。

CREATE SCHEMA testSchema
        create table REF_PRODUCT (
            id int8 not null,
            created_date timestamp,
            CODE varchar(255),
            DESCRIPTION varchar(255),
            LOCATION varchar(255),
            MANUFACTURER varchar(255),
            NAME varchar(255),
            COST numeric(19, 2),
            DEALERS_PRICE numeric(19, 2),
            SUGGESTED_RETAIL_PRICE numeric(19, 2),
            STOCK int4,
            PRODUCT_TYPE varchar(255),
            picture_id int8,
            primary key (id)
        )

        create table TXN_LINE_ITEM (
            id int8 not null,
            created_date timestamp,
            cancelled boolean,
            cost numeric(19, 2),
            dp numeric(19, 2),
            itemCode varchar(255),
            itemName varchar(255),
            priceType varchar(255),
            qty int4,
            refunded boolean,
            srp numeric(19, 2),
            total numeric(19, 2),
            transactionRecord_id int8,
            primary key (id)
        )

        create table TXN_PRODUCT_PICTURE (
            id int8 not null,
            created_date timestamp,
            picture bytea,
            primary key (id)
        )

        create table TXN_TRANSACTION_RECORD (
            id int8 not null,
            created_date timestamp,
            total numeric(19, 2),
            transaction_date timestamp,
            TRANSACTION_NUMBER varchar(255),
            VALID boolean,
            primary key (id)
        )

        alter table REF_PRODUCT
            add constraint FK_sjugahpelk16qj5h3w8dli42l
            foreign key (picture_id)
            references TXN_PRODUCT_PICTURE;

        alter table TXN_LINE_ITEM
            add constraint FK_o5mslaahpil9d3g9rl2s22rpm
            foreign key (transactionRecord_id)
            references TXN_TRANSACTION_RECORD;

        create table SEQ_ENTITY_ID (
             sequence_name varchar(255),
             sequence_next_hi_value int4
        );

问题是没有创建alter table语句中指定的fk关系

由于此错误。

[WARNING  ] CREATE SCHEMA testSchema
                    create table REF_PRODUCT (
                        id int8 not null,
                        created_date timestamp,
                        CODE varchar(255),
                        DESCRIPTION varchar(255),
                        LOCATION varchar(255),
                        MANUFACTURER varchar(255),
                        NAME varchar(255),
                        COST numeric(19, 2),
                        DEALERS_PRICE numeric(19, 2),
                        SUGGESTED_RETAIL_PRICE numeric(19, 2),
                        STOCK int4,
                        PRODUCT_TYPE varchar(255),
                        picture_id int8,
                        primary key (id)
                    )

                    create table TXN_LINE_ITEM (
                        id int8 not null,
                        created_date timestamp,
                        cancelled boolean,
                        cost numeric(19, 2),
                        dp numeric(19, 2),
                        itemCode varchar(255),
                        itemName varchar(255),
                        priceType varchar(255),
                        qty int4,
                        refunded boolean,
                        srp numeric(19, 2),
                        total numeric(19, 2),
                        transactionRecord_id int8,
                        primary key (id)
                    )

                    create table TXN_PRODUCT_PICTURE (
                        id int8 not null,
                        created_date timestamp,
                        picture bytea,
                        primary key (id)
                    )

                    create table TXN_TRANSACTION_RECORD (
                        id int8 not null,
                        created_date timestamp,
                        total numeric(19, 2),
                        transaction_date timestamp,
                        TRANSACTION_NUMBER varchar(255),
                        VALID boolean,
                        primary key (id)
                    )

                    alter table REF_PRODUCT
                        add constraint FK_sjugahpelk16qj5h3w8dli42l
                        foreign key (picture_id)
                        references TXN_PRODUCT_PICTURE
            ERROR:  syntax error at or near "alter"
            LINE 53:         alter table REF_PRODUCT
                             ^
[WARNING  ] alter table TXN_LINE_ITEM
                        add constraint FK_o5mslaahpil9d3g9rl2s22rpm
                        foreign key (transactionRecord_id)
                        references TXN_TRANSACTION_RECORD
            ERROR:  relation "txn_line_item" does not exist
[WARNING  ] create table SEQ_ENTITY_ID (
                         sequence_name varchar(255),
                         sequence_next_hi_value int4
                    )
            ERROR:  relation "seq_entity_id" already exists

注意:我所做的Schema上没有现有的表格。我错过了什么?

1 个答案:

答案 0 :(得分:2)

我认为你有两种方法可以做到这一点。

第一个:不要运行一个create schema语句,而是为每个部分运行单独的语句(这是我更喜欢的)。您仍然可以将其作为单个交易执行:

begin transaction;
CREATE SCHEMA testSchema; -- only create the namespace

-- make the new schema the default schema
-- so the the tables do not need to be full qualified
set search_path = testschema;

create table REF_PRODUCT (
...
);

create table TXN_LINE_ITEM (
...
);

create table TXN_PRODUCT_PICTURE (
...
);

create table TXN_TRANSACTION_RECORD (
...
);

alter table REF_PRODUCT
    add constraint fk_product_picture
    foreign key (picture_id)
    references TXN_PRODUCT_PICTURE;

alter table TXN_LINE_ITEM
    add constraint FK_line_item_trans_record
    foreign key (transactionRecord_id)
    references TXN_TRANSACTION_RECORD;

create table SEQ_ENTITY_ID (
     sequence_name varchar(255),
     sequence_next_hi_value int4
);

commit;

另一个选项是将外键移动到表定义中,但是您需要重新排序create table语句:

CREATE SCHEMA testSchema

  create table TXN_PRODUCT_PICTURE (
  ...
  )

  create table TXN_TRANSACTION_RECORD (
  ...
  )

  create table REF_PRODUCT (
    ...,
    constraint fk_product_picture
    foreign key (picture_id)
    references TXN_PRODUCT_PICTURE
  )

  create table TXN_LINE_ITEM (
    ...
    constraint FK_line_item_trans_record
      foreign key (transactionRecord_id)
      references TXN_TRANSACTION_RECORD
  )

  create table SEQ_ENTITY_ID (
       sequence_name varchar(255),
       sequence_next_hi_value int4
  )
  ;

无关,但是: 这个SEQ_ENTITY_ID表是什么用的?为什么不使用本地Postgres序列。它们比您在应用程序中可以执行的任何操作都更快,更具可伸缩性和更强大,以生成唯一数字