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

How to get random foreign key in SQL Developer?

在 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

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

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

对于大量数据,您还可以使用 the sample() clause 来避免必须从 table:

中查找和排序所有值
SELECT id_garancija
INTO gar
FROM garancija
SAMPLE(1)
WHERE rownum = 1;

可以根据table的大小设置样本大小;例如,对于 10000 行,您可以使用 0.1。您可以阅读更多 here.

如果您同时填充父项和子项 table,您可以考虑使用相同的值将 INSERT ALL 语法同时插入到多个 table 中(例如,从序列中)始终如一,而不是稍后再次查找它们。不过,您似乎需要外键的随机组合,因此这在这里可能没有帮助。