如何在SQL Developer中获取随机外键?

时间:2015-01-10 18:44:52

标签: oracle

在SQL Developer中创建所有表后,我需要用至少10000个条目填充它们。我没有问题表没有FK零。 如何从其他表中获取随机值?

select rand()在此语句中不起作用。但是max()确实如此。

CREATE OR REPLACE PROCEDURE NAPOLNI_ARTIKEL 
(
  ST_ARTIKLOV IN VARCHAR2 DEFAULT 10000 
) AS 
  naziv VARCHAR2(25);
  opis VARCHAR2(25);
  model VARCHAR2(10);
  cena FLOAT(2);
  gar INTEGER;
  ddv INTEGER;
  tip INTEGER;
CURSOR c1 IS
  SELECT id_dobavitelj
  FROM dobavitelj;
BEGIN
FOR rndx IN c1 LOOP
  FOR st IN 1..ST_ARTIKLOV LOOP
    naziv := 'naziv';
    naziv := naziv ||' '|| TO_CHAR(st);
    opis := 'opis';
    opis := opis ||' '|| TO_CHAR(st);
    model := 'model';
    model := model ||' '|| TO_CHAR(st);

    cena := dbms_random.value(1.25,230.0);

    SELECT NVL(RAND(id_garancija),1)
    INTO gar
    FROM garancija;

    SELECT NVL(RAND(id_ddv),1)
    INTO ddv
    FROM DDV;

    SELECT NVL(RAND(id_tip),1)
    INTO tip
    FROM tip;

    INSERT INTO ARTIKEL(ID_ARTIKLA, NAZIV, OPIS, MODEL, CENA, TIP_ID_TIP, DOBAVITELJ_ID_DOBAVITELJ, GARANCIJA_ID_GARANCIJE, DDV_ID_DDV) VALUES (st, naziv, opis, model, cena, tip, rndx, gar, ddv);
  END LOOP;
END LOOP;
END NAPOLNI_ARTIKEL;
   * id_artikla INTEGER NOT NULL ,
   * naziv      VARCHAR2 (25) NOT NULL ,
     opis       VARCHAR2 (25) ,
   * model      VARCHAR2 (10) NOT NULL ,
   * cena FLOAT (2) NOT NULL ,
 F * Tip_id_tip               INTEGER NOT NULL ,
 F * Dobavitelj_id_dobavitelj INTEGER NOT NULL ,
 F   Garancija_id_garancije   INTEGER ,
 F * DDV_id_ddv               INTEGER NOT NULL

1 个答案:

答案 0 :(得分:1)

要从表中选择一个随机值,您可以使用随机排序的子查询,然后从中选择第一行:

SELECT id_garancija
INTO gar
FROM (
  SELECT id_garancija
  FROM garancija
  ORDER BY dbms_random.value
)
WHERE rownum = 1;

对于大量数据,您还可以使用the sample() clause来避免必须从表中查找和排序所有值:

SELECT id_garancija
INTO gar
FROM garancija
SAMPLE(1)
WHERE rownum = 1;

您可以根据表格的大小设置样本大小;例如,10000行就可以使用0.1。您可以阅读更多here

如果您同时填充父表和子表,则可以考虑将INSERT ALL语法同时插入多个表中,使用相同的值(例如,从序列中),而不是稍后再看一遍。看起来你想要外键的随机组合,所以这可能没有帮助。