Создать три связанные таблицы с миллионом случайных строк PostgreSQL

Рейтинг: 0Ответов: 1Опубликовано: 16.04.2023

Необходимо создать 3 таблицы со структурой:

● Таблица "users" с полями: id, name, email, created_at

● Таблица "orders" с полями: id, user_id, total_price, created_at

● Таблица "order_items" с полями: id, order_id, product_name, price, quantity

Очевидно, что они должны быть связаны по колонке "id". Кроме того, таблицы необходимо наполнить данными. По 1 миллиону строк каждая. Удалось сгенерировать и наполнить 1 таблицу. Но не понимаю, как сделать 3 таких связанных по полю id.

CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT,
email TEXT,
created_at DATE
);

INSERT INTO users (name, email, created_at)
SELECT
substr(md5(random()::TEXT), 0, 10),
substr(md5(random()::TEXT), 0, 10) || '@example.com',
DATE '2018-01-01' + (random() * 700)::integer
FROM generate_series(1, 1000000);

Ответы

▲ 0Принят

Как пример:

CREATE TABLE users (id SERIAL PRIMARY KEY,name TEXT,email TEXT,created_at DATE);
CREATE TABLE orders (id serial PRIMARY KEY, user_id INT REFERENCEs users(id)
  , total_price float, created_at DATE);
CREATE TABLE order_items (id serial PRIMARY KEY, order_id INT REFERENCEs orders(id)
   ,product_name text, price float, quantity float);
INSERT INTO users (name, email, created_at)
SELECT
   'U_'||substr(md5(random()::TEXT), 0, 10),
   substr(md5(random()::TEXT), 0, 10) || '@example.com',
   DATE '2018-01-01' + (random() * 700)::integer
FROM generate_series(1, 10);

INSERT INTO orders (user_id)
SELECT
  ((random() * 9)::integer)+1 
FROM generate_series(1, 12);

update orders
   set created_at=u.created_at+ (random() * 700)::integer
  ,total_price=0.0
from orders o left join users u on u.id=o.user_id;

INSERT INTO order_items (order_id)
SELECT
  ((random() * 11)::integer)+1 
FROM generate_series(1, 20);

update order_items
  set price= round((random() * 700.0)::numeric,2)
    ,quantity= round((random() * 100.0)::numeric,2)
    ,product_name = 'P_'||substr(md5(random()::TEXT), 0, 10);

update orders
  set total_price=t.order_total::float
from  
(select order_id,sum(quantity*price) order_total from order_items group by order_id) t
where  t.order_id= orders.id;