2015-01-13 1 views
0

Итак, я пытаюсь заполнить таблицу, которая соединяет две разные таблицы, случайным образом отбирает идентификатор из таблицы продуктов x количество времени, а затем помещает этот идентификатор вместе с идентификатором таблицы магазинов. А затем повторить это для всего id из таблицы shopa. Таким образом, каждый магазин получает случайное количество продуктов; Тем не менее, потому что иногда мой случайно выбранный идентификатор совпадает как идентификатор, который уже в таблице, напримерPlsql не будет вставлять из-за повторяющихся записей

магазин = 1 || продукт = 34

магазин = 1 || продукт = 20

shop = 1 || продукт = 34

Как я могу предотвратить это код, который я пытаюсь выполнить это

create or replace PROCEDURE GENERATEPRODUCTS 
AS 
PRODUCTTEMP NUMBER; 
NROFPRODUCTS NUMBER;--total number of available products 
NROFWINKELS NUMBER;--total number of shops 
MAXNROFPRODUCT NUMBER;-- the maximum amount of products to be inserted 
PRODUCTPERCENTAGEZONDER NUMBER;-- random percentage that will be added to 90% 
PRODUCTPERCENTAGEMET NUMBER;-- total percentage of to be inserted products 
WINKELS NUMBER;--counter for looping through shops 
PRODUCTIDTEMP NUMBER;--the id of the product that needs to be inserted 
BEGIN 
PRODUCTIDTEMP :=1; 
WINKELS := 1; 
PRODUCTPERCENTAGEMET :=0; 
PRODUCTPERCENTAGEZONDER := 0; 
select count(ID) 
into NROFWINKELS 
FROM WINKEL; 
select count(ID) 
into NrofWinkels 
FROM WINKEL; 
select count(ID) 
into NROFPRODUCTS 
FROM PRODUCT; 
select DBMS_RANDOM.VALUE(0,10) into PRODUCTPERCENTAGEZONDER FROM DUAL; 
PRODUCTPERCENTAGEMET := (90+PRODUCTPERCENTAGEZONDER)*.010; 
MAXNROFPRODUCT:=ROUND(NROFPRODUCTS*PRODUCTPERCENTAGEMET); 
WHILE WINKELS <= NROFWINKELS 
LOOP 
WHILE MAXNROFPRODUCT<=NROFPRODUCTS 
LOOP 
SELECT ID 
INTO PRODUCTTEMP 
FROM(
SELECT ID 
FROM PRODUCT 
ORDER BY DBMS_RANDOM.VALUE) 
WHERE ROWNUM=1; 
INSERT INTO WINKEL_COUPON 
("ID",WINKEL_ID,COUPON_ID) 
VALUES 
(PRODUCTIDTEMP,WINKELS,PRODUCTTEMP); 
PRODUCTIDTEMP := PRODUCTIDTEMP+1; 
END LOOP; 
WINKELS := WINKELS+1; 
END LOOP; 
END; 

В этом коде я хочу, чтобы каждый магазин получает по крайней мере 90% доступных продуктов;

ответ

0

Я думаю, вы должны положить КОНСТРУКЦИЯ на стол.

Таким образом, вы можете удостовериться, что некоторые столбцы имеют в них уникальное значение. Например, если вы хотите, чтобы значение ColumnShop и ColumnProduct вместе, чтобы быть уникальным в таблице, вы должны поставить contstraint на стол, который выглядит примерно так:

CONSTRAINT <NameTheConstraint> PRIMARY KEY(Shop, Product) 

Делая это, таблица будет только принимайте значения, которые нужно вставить в уникальную таблицу. So Shop = 1, Product = 34 будет вставлен, если эта комбинация еще не существует. Если это произойдет, это будет атоматически поднять ошибку, которая нарушила ограничение.