Вставить в представление postgres, используя значения по умолчанию на основе определения представления - PullRequest
0 голосов
/ 01 мая 2018

Нello! Скажем, что vehicle может быть типа "автомобиль", "грузовик" или "мотоцикл". Каждое транспортное средство имеет top_speed (в км / ч) и license_plate строку.

* 1006 Е.Г. *

CREATE TABLE vehicle (
  type VARCHAR(20) NOT NULL,
  top_speed INTEGER NOT NULL,
  license_plate VARCHAR(10) NOT NULL
);

INSERT INTO vehicle (type, top_speed, license_plate)
  VALUES
    ('car', 120, 'abc123'),
    ('truck', 110, 'def456'),
    ('motorcycle', 140, 'ghi789');

Теперь добавьте виды для каждого типа транспортного средства:

CREATE VIEW car AS (SELECT * FROM vehicle WHERE type='car');
CREATE VIEW truck AS (SELECT * FROM vehicle WHERE type='truck');
CREATE VIEW motorcycle AS (SELECT * FROM vehicle WHERE type='motorcycle');

Все это прекрасно и модно. Но я сталкиваюсь с неудобной ситуацией, когда пытаюсь вставить в эти представления:

INSERT INTO car (type, top_speed, license_plate)
  VALUES
    ('car', 160, 'v4n1ty');

Моя проблема в том, что я уже вставляю в представление под названием "машина" ... почему я должен потрудиться указать, что type = 'car'?

Если я опущу столбец type в этом запросе на вставку, я получу ошибку, что столбец type не может содержать NULL. Похоже, что postgres не пропустит значения по умолчанию, даже если их можно почерпнуть из определения представления.

Есть ли способ заставить postgres просматривать определение представления, чтобы обеспечить значения по умолчанию для пропущенных столбцов в запросах INSERT?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

В PostgreSQL есть очень мощная система правил .

Дополнительно к вашему коду:

create rule car_insert as on insert to car do instead
  insert into vehicle(type, top_speed, license_plate)
    values('car', new.top_speed, new.license_plate);

insert into car(top_speed, license_plate) values(160,'v4n1ty');

table car;
┌──────┬───────────┬───────────────┐
│ type │ top_speed │ license_plate │
├──────┼───────────┼───────────────┤
│ car  │       120 │ abc123        │
│ car  │       160 │ v4n1ty        │
└──────┴───────────┴───────────────┘
0 голосов
/ 02 мая 2018

Postgres может помешать вам вставить строки в представление, которые не будут видны в представлении. Синтаксис WITH CHECK OPTION в конце CREATE VIEW.

Вывод значений столбцов из предложения where представления не поддерживается. Вы можете смоделировать это с помощью instead of insert триггера :

CREATE FUNCTION insertCar() RETURNS trigger AS $$
BEGIN
    INSERT INTO vehicle
        (type, top_speed, license_plate)
    VALUES
        ('car', new.top_speed, new.license_plate);
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER insertCarTrigger INSTEAD OF INSERT ON car
  FOR EACH ROW EXECUTE PROCEDURE insertCar();
...