【问题标题】:INSERT statement for Class Table Inheritance model类表继承模型的 INSERT 语句
【发布时间】:2017-10-16 22:21:49
【问题描述】:

我有两个表定义如下:

create table MY_COMPONENT (
ID uuid,
VERSION integer not null,
CREATE_TS timestamp,
CREATED_BY varchar(50),
UPDATE_TS timestamp,
UPDATED_BY varchar(50),
DELETE_TS timestamp,
DELETED_BY varchar(50),
DTYPE varchar(31),
--
PRODUCT_NUMBER varchar(255),
DESCRIPTION varchar(255),
MANUFACTURER varchar(100),
--
primary key (ID)
)

create table BASE (
ID uuid,
primary key (ID)
)

BASE 是 MY_COMPONENT 的子类。

我有以下限制:

create unique index IDX_DEIPRODUCTCONFIG2_MY_COMPONENT_UK_PRODUCT_NUMBER 
on DEIPRODUCTCONFIG2_MY_COMPONENT (PRODUCT_NUMBER) where DELETE_TS is null 

alter table DEIPRODUCTCONFIG2_BASE add constraint FK_DEIPRODUCTCONFIG2_BASE_ID 
foreign key (ID) references DEIPRODUCTCONFIG2_MY_COMPONENT(ID)

我想要做的是类似的事情

INSERT INTO BASE(ID, VERSION, PRODUCT_NUMBER, DESCRIPTION, MANUFACTURER);

我发现这个确切的语法不起作用,因为BASE 没有PRODUCT_NUMBERDESCRIPTIONMANUFACTURER,因为它们存储在MY_COMPONENT 表中。我还尝试使用NEWID()MY_COMPONENT 中插入一行,并使用相同的ID 尝试插入BASE。我也尝试了与此相反的操作,首先插入BASE,然后使用其ID 插入MY_COMPONENT。这两个都会引发有关违反唯一约束的错误。

我很清楚,我对数据库编程非常陌生。这些表和约束不是我创造的;我正在使用 CUBA 平台进行开发,这些表创建脚本是自动为我生成的。我确实了解 CREATE 语句的语法,但 FOREIGN_KEY 的用途和用途对我来说并不是很清楚。也许那是我缺失的环节。但我们将不胜感激任何指导。

【问题讨论】:

    标签: sql postgresql inheritance foreign-keys insert-into


    【解决方案1】:

    我可能错过了一点,但我无法重现您的问题,MY_COMPONENT 然后 BASE 中的插入对我来说似乎很合适......

    无论如何,如果你想用存储过程来做,那就是:

    CREATE FUNCTION addbase(
        version INTEGER,
        product_number VARCHAR(255)
      --
    ) RETURNS VOID AS $$
    DECLARE
        uid uuid := uuid_generate_v4();
    BEGIN
        INSERT INTO my_component(id,version,product_number) 
        VALUES(uid, version,product_number);
        INSERT INTO base(id) 
        VALUES(uid);
    END ;
    $$ LANGUAGE plpgsql /
    

    完整答案

    SQL Fiddle

    PostgreSQL 9.6 架构设置

    CREATE EXTENSION IF NOT EXISTS "uuid-ossp"
    /
    create table MY_COMPONENT (
    ID uuid,
    VERSION integer not null,
    CREATE_TS timestamp,
    CREATED_BY varchar(50),
    UPDATE_TS timestamp,
    UPDATED_BY varchar(50),
    DELETE_TS timestamp,
    DELETED_BY varchar(50),
    DTYPE varchar(31),
    --
    PRODUCT_NUMBER varchar(255),
    DESCRIPTION varchar(255),
    MANUFACTURER varchar(100),
    --
    primary key (ID)
    )
    /
    create table BASE (
    ID uuid,
    primary key (ID)
    )
    /
    
    create unique index IDX_DEIPRODUCTCONFIG2_MY_COMPONENT_UK_PRODUCT_NUMBER 
    on MY_COMPONENT (PRODUCT_NUMBER) where DELETE_TS is null 
    /
    alter table BASE add constraint FK_DEIPRODUCTCONFIG2_BASE_ID 
    foreign key (ID) references MY_COMPONENT(ID)
    /
    
    
    CREATE FUNCTION addbase(
        version INTEGER,
        product_number VARCHAR(255)
      --
    ) RETURNS VOID AS $$
    DECLARE
        uid uuid := uuid_generate_v4();
    BEGIN
        INSERT INTO my_component(id,version,product_number) 
        VALUES(uid, version,product_number);
        INSERT INTO base(id) 
        VALUES(uid);
    END ;
    $$ LANGUAGE plpgsql / 
    

    查询 1

    insert into MY_COMPONENT(ID,VERSION,PRODUCT_NUMBER) 
      values(uuid_generate_v4(), 1,'1-dynamic')
    

    Results查询 2

    insert into BASE(ID) select ID from MY_COMPONENT where PRODUCT_NUMBER ='1-dynamic'
    

    Results查询 3

    insert into MY_COMPONENT(ID,VERSION,PRODUCT_NUMBER) 
      values('774033f8-52a6-4b1f-8602-03ce3c5a7432', 2,'2-static')
    

    Results查询 4

    insert into BASE(ID) 
      values('774033f8-52a6-4b1f-8602-03ce3c5a7432')
    

    Results查询 5

    select addbase( 44,'3-stored-procedure')
    

    Results

    | addbase |
    |---------|
    |         |
    

    查询 6

    select * from MY_COMPONENT
    

    Results

    |                                   id | version | create_ts | created_by | update_ts | updated_by | delete_ts | deleted_by |  dtype |     product_number | description | manufacturer |
    |--------------------------------------|---------|-----------|------------|-----------|------------|-----------|------------|--------|--------------------|-------------|--------------|
    | e48124ff-a26c-4d10-93a7-48da77b613e6 |       1 |    (null) |     (null) |    (null) |     (null) |    (null) |     (null) | (null) |          1-dynamic |      (null) |       (null) |
    | 774033f8-52a6-4b1f-8602-03ce3c5a7432 |       2 |    (null) |     (null) |    (null) |     (null) |    (null) |     (null) | (null) |           2-static |      (null) |       (null) |
    | b6ecb3ce-e3c2-4f68-8a19-9cfceeba1263 |      44 |    (null) |     (null) |    (null) |     (null) |    (null) |     (null) | (null) | 3-stored-procedure |      (null) |       (null) |
    

    查询 7

    select * from BASE
    

    Results

    |                                   id |
    |--------------------------------------|
    | e48124ff-a26c-4d10-93a7-48da77b613e6 |
    | 774033f8-52a6-4b1f-8602-03ce3c5a7432 |
    | b6ecb3ce-e3c2-4f68-8a19-9cfceeba1263 |
    

    【讨论】:

    • 你是绝对正确的。我试图通过函数运行我的查询,以运行古巴工作室内置的更新脚本。我将我的测试脚本移至 Cuba 在创建数据库时运行的 INIT_DATA 脚本,并且数据已成功插入。我不确定这是否是他们这边的错误。谢谢好心人。
    • @no-one 不客气,如果你想一次性完成双插入,我添加了一个存储过程;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多