2017-10-16 20 views
3

J'ai deux tables définies comme suit:instruction INSERT pour le modèle d'héritage de table de classe

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) 
) 

et

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

BASE est une sous-classe de MY_COMPONENT.

J'ai la contrainte suivante:

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) 

Ce que je suis en train de faire est quelque chose comme

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

Comme je l'ai découvert cette syntaxe exacte ne fonctionne pas parce que BASE ne le fait pas ont un PRODUCT_NUMBER, DESCRIPTION, ou MANUFACTURER car ceux-ci sont stockés dans le tableau MY_COMPONENT. J'ai également essayé d'insérer une ligne dans MY_COMPONENT avec NEWID() et en utilisant ce même ID pour essayer et insérer dans BASE. J'ai également essayé l'inverse de cela, en insérant d'abord le BASE puis en utilisant son ID pour l'insérer dans MY_COMPONENT. Ces deux erreurs lancent des violations de contraintes uniques.

Comme je suis sûr est clair, je suis très nouveau à la programmation de base de données. Ces tables et contraintes ne sont pas ma création; J'utilise la plate-forme CUBA pour le développement et ces scripts de création de table sont générés automatiquement pour moi. Je comprends la syntaxe de l'instruction CREATE mais le but et l'utilisation de FOREIGN_KEY ne sont pas vraiment clairs pour moi. C'est peut-être mon lien manquant. Mais toute directive serait très appréciée.

Répondre

1

me manque probablement un point, mais je ne peux pas reproduire votre problème, l'insert dans MY_COMPONENT puis BASE semblent nageoire me ...

Quoi qu'il en soit, si vous voulez faire avec une procédure stockée, ici il est:

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/

réponse complète

SQL Fiddle

PostgreSQL 9.6 Configuration du schéma:

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/

Query 1:

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

Results: Query 2:

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

Results: Query 3:

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

Results: Query 4:

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

Results: Query 5:

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

Results:

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

Query 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) | 

Recherche 7:

select * from BASE 

Results:

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

Vous êtes tout à fait raison. J'essayais d'exécuter mes requêtes via la fonction pour exécuter des scripts de mise à jour intégrés au Studio de Cuba. J'ai déplacé mes scripts de test dans le script INIT_DATA que Cuba exécute lors de la création d'une base de données et les données ont été insérées avec succès. Je ne suis pas sûr que ce soit un bug de leur côté. Merci bonne âme. –

+0

@ personne ne vous êtes les bienvenus, j'ai ajouté un proc stocké si vous voulez faire le double insert en une seule fois;) – Blag