Создать три связанные таблицы с миллионом случайных строк PostgreSQL
Необходимо создать 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);
Ответы (1 шт):
Автор решения: ValNik
→ Ссылка
Как пример:
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;