SQL

SQL. Есть таблица а и b как мне поставить ограничение на поле таблицы b, на основании поля таблицы a? пример в описании

Есть таблица a с айди и полем ask. при создании таблицы b нужно наложить ограничение на поле task такое, что бы в него я мог вписывать id из таблицы a только такие, где ask=1

create table a (id serial primary, ask int);
insert into a (ask) values ('1');
insert into a (ask) values ('2');
insert into a (ask) values ('1');
insert into a (ask) values ('2');
insert into a (ask) values ('1');

create table b(id serial primary key, task int references a(id) .... И ТУТ НУЖНО ПОСТАВИТЬ ОГРАНИЧЕНИЕ ТАКОЕ, ЧТО БЫ Я СЮДА МОГ ПИСАТЬ ТОЛЬКО ТЕ ID из таблицы a, НАПРОТИВ КОТОРЫХ ASK=1)
Я так понял, речь идёт о PostgreSQL, поэтому варианты решения буду основывать на этой системе.

Вариант 1. Использовать правило (rule) для определённых действий. Например, чтобы добавлять в таблицу b только нужные записи, можно использовать такое правило:
 create rule check_b_insert as on insert to b 
where new.task not in (select id from a where ask=1)
do instead nothing;
Неудобство этого способа в том, что, во-первых, надо написать правила для вставки и обновления таблицы b, а также для обновления и удаления таблицы a (ведь надо поддерживать целостность и после добавления записей в b); во-вторых, если правило срабатывает, никаких ошибок не возникает, записи просто игнорируются.


Вариант 2. В ограничении на поле можно использовать собственную функцию:
 create function check_task(task int) returns boolean  
as 'select task in (select id from a where ask=1)'
language SQL;

create table b
(
id serial primary key,
task int references a(id) check(check_task(task))
);

Вариант 3. Немного модифицировав таблицы, можно наложить ограничение встроенными средствами. Идея в использовании в таблице b внешнего ключа по двум полям, соответствующим полям id и ask в таблице a, для чего в таблицу b добавляется генерируемый столбец ask, всегда равный 1.
 create table a  
(
id serial primary key,
ask int,
unique (id, ask)
);

create table b
(
id serial primary key,
task int,
ask int generated always as (1) stored,
foreign key (task, ask) references a(id, ask)
);
Если же вдруг генерируемый столбец использовать не хочется, можно добавить обычный столбец, но ограничить его значение:
 ask int check(ask=1) default 1 
Хамзя Газизов
Хамзя Газизов
12 091
Лучший ответ
Дык сделай ключ на два поля, а для той половинки, которая ask, сделай ограничение. Оракловский синтаксис:

 ALTER TABLE B ADD (TASK_ASK A.ASK%TYPE);
ALTER TABLE A ADD PRIMARY KEY (ID, ASK);
ALTER TABLE B ADD CONSTRAINT FK_A FOREIGN KEY(TASK, TASK_ASK) REFERENCES A (ID, ASK);
ALTER TABLE B ADD CONSTRAINT ASK_1 CHECK (TASK_ASK=1);
что-то твой рисунок с твоим описанием не сходится...

может нормально расскажешь какую именно проблему ты пытаешься решить? (без упоминания таблиц и баз вообще)
Макс Fomin
Макс Fomin
83 187
создай таблицу из результатов запроса, синтаксис не помню, гугли...

SELECT id as 'task'
FROM A
Where ask = 1

Правда, насчет первого столбца id таблицы B - не помню. Там или автоматически id подтянет или генератор чисел поставь.
все через жёпу сделал . нельзя такие ограничения накладывать ограничение должно быть вся колонка из другой таблицы а не какое то там если семь равно пяти в понедельник утром .