2017-10-16 163 views
3

INSERT语句我有定义两个表如下:类表继承模型

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_NUMBER,DESCRIPTIONMANUFACTURER,因为那些存储在MY_COMPONENT表中。我还尝试在MY_COMPONENTNEWID()之间插入一行,并使用相同的ID尝试插入BASE。我也尝试了与此相反的做法,先插入BASE,然后用ID插入MY_COMPONENT。这两个都会抛出关于唯一约束违规的错误。

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

回答

1

我可能错过了点,但我无法重现你的问题,然后MY_COMPONENTBASE插入似乎鱼翅给我...

无论如何,如果你想用一个存储过程来做到这一点,在这里它是:

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 | 
+0

你是绝对正确的。我试图通过该函数运行我的查询来运行内置于古巴工作室的更新脚本。我将测试脚本移动到古巴在创建数据库和成功插入数据时运行的INIT_DATA脚本。我不确定这是否是一个错误。谢谢你的灵魂。 –

+0

@没有人欢迎你,我添加了一个存储过程,如果你想要做的双插一气呵成;) – Blag