2017-10-16 164 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