| | 357 | ===== Order-Article |
| | 358 | |
| | 359 | * Креирање на нова табела за `order items` |
| | 360 | |
| | 361 | {{{#!sql |
| | 362 | CREATE TABLE order_item ( |
| | 363 | item_id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, |
| | 364 | ord_id BIGINT NOT NULL, |
| | 365 | art_id BIGINT NOT NULL, |
| | 366 | quantity INT NOT NULL, |
| | 367 | unit_price DECIMAL(10,2) NOT NULL, |
| | 368 | total_price DECIMAL(10,2) GENERATED ALWAYS AS (quantity * unit_price) STORED, |
| | 369 | FOREIGN KEY (ord_id) REFERENCES orders (ord_id), |
| | 370 | FOREIGN KEY (art_id) REFERENCES article (art_id), |
| | 371 | UNIQUE (ord_id, art_id) |
| | 372 | ); |
| | 373 | }}} |
| | 374 | |
| | 375 | * Креирање тригер и функција за да се прави пресметката на сума |
| | 376 | |
| | 377 | {{{#!sql |
| | 378 | CREATE OR REPLACE FUNCTION update_order_sum() |
| | 379 | RETURNS TRIGGER AS $$ |
| | 380 | BEGIN |
| | 381 | UPDATE orders |
| | 382 | SET ord_sum = (SELECT COALESCE(SUM(total_price), 0) |
| | 383 | FROM order_item WHERE ord_id = NEW.ord_id) |
| | 384 | WHERE ord_id = NEW.ord_id; |
| | 385 | RETURN NEW; |
| | 386 | END; |
| | 387 | $$ LANGUAGE plpgsql; |
| | 388 | |
| | 389 | CREATE TRIGGER order_item_after_change |
| | 390 | AFTER INSERT OR UPDATE OR DELETE ON order_item |
| | 391 | FOR EACH ROW EXECUTE FUNCTION update_order_sum(); |
| | 392 | }}} |
| | 393 | |
| | 394 | |
| | 395 | |