Postgresql Попытка реализовать один-ко-многим - PullRequest
0 голосов
/ 30 апреля 2020

это мой первый практический опыт работы с Sql, и я пытаюсь построить отношения «один ко многим», вот код SQL:

create table car (
    id SERIAL PRIMARY KEY,
    make VARCHAR(100) NOT NULL,
    model VARCHAR(100) NOT NULL,
    price NUMERIC(19, 2) NOT NULL
);

create table person (
    id BIGSERIAL NOT NULL PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    gender VARCHAR(7) NOT NULL,
    email VARCHAR(100),
    date_of_birth DATE NOT NULL,
    country_of_birth VARCHAR(50) NOT NULL,
    cars_owning INT[] REFERENCES car(id)
);

, и я получаю это ошибка:

Key columns "cars_owning" and "id" are of incompatible types: integer[] and integer.

Вот модель, на которой человек может иметь много автомобилей, но у каждого автомобиля может быть только один владелец

1 Ответ

2 голосов
/ 30 апреля 2020

обычно (как хорошее общее правило) many относится к one. не наоборот, как вы пытались.

Итак, измените схему следующим образом:

create table car (
    id SERIAL PRIMARY KEY,
    make VARCHAR(100) NOT NULL,
    model VARCHAR(100) NOT NULL,
    price NUMERIC(19, 2) NOT NULL, 
    owner_id BIGINT FOREIGN KEY REFERENCES person(id)
);

create table person (
    id BIGSERIAL NOT NULL PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    gender VARCHAR(7) NOT NULL,
    email VARCHAR(100),
    date_of_birth DATE NOT NULL,
    country_of_birth VARCHAR(50) NOT NULL
);

Если вам нужно получить список автомобилей, принадлежащих человеку, используйте этот оператор выбора

SELECT person.id, ARRAY_AGG(car.id) owns_car_ids
FROM person
LEFT JOIN car ON person.id = car.owner_id
GROUP BY 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...