вопрос по массивам и ограничения на их элементы при создании таблицы

kiki
Дата: 25.06.2004 21:55:48
Доброго времени.

;) Я пытаюсь наложить ограничения на два элемента массива в таблице при создании.
(к сожалению я не нашёл ответа в книге O'Reilly - Postgres, google тоже не помог)
для одного элемента понятно


CREATE TABLE foobar (
......
fooarray int[] DEFAULT '{0, 1440}' CHECK KEY (fooarray[1] between 0 AND 1399),
......
);

подскажите как мне установить это ограничение не только на этот элемент массива но и ещё на второй, т.е. в идиале я хочу сделать ограничение такое:

0 < forarray[1] < 1399 && 0 < forrarray[2] < 1440 && forarray[1] < forrarray[2]

заранее спасибо за ответы
с уважением ;)
kiki
Дата: 25.06.2004 22:04:09
ненашёл, как изменить своё сообщение, посему добавляю так.

не предлагать использовать триггер :) интересует именно КОНСТРУКЦИЯ CHECK

ещё раз заранее спасибо за ваши ответы.
kiki
Дата: 25.06.2004 22:27:25
:) ответ нашёлся после чтения документации на www.postgres.org ;)

если кому интересно решение:

CREATE TABLE products (
product_no integer,
name text,
price numeric CHECK (price > 0),
discounted_price numeric,
CHECK (discounted_price > 0 AND price > discounted_price)
);


хм ;) но теперь остается вопрос!

можно ли поставить ограничение на __ВСЕ__ элементы массива?

ещё раз спасибо заранее ;)
gamych
Дата: 28.06.2004 23:06:03
kiki
ненашёл, как изменить своё сообщение, посему добавляю так.

не предлагать использовать триггер :) интересует именно КОНСТРУКЦИЯ CHECK

ещё раз заранее спасибо за ваши ответы.

Не хочешь триггер - не надо. Пиши хранимую процедуру, возвращающую bool, передавай ей поле - внутри проверяй всё, что угодно.
Sad Spirit
Дата: 29.06.2004 14:29:28
kiki
можно ли поставить ограничение на __ВСЕ__ элементы массива?


можно:
Welcome to psql 7.4.2, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

test=# CREATE TABLE foo (
test(#     bar integer[],
test(#     CONSTRAINT bar_positive CHECK (0 < ALL(bar))
test(# );
CREATE TABLE
test=# INSERT INTO foo VALUES ('{1,2,3}');
INSERT 178322 1
test=# INSERT INTO foo VALUES ('{-1,2,3}');
ERROR:  new row for relation "foo" violates check constraint "bar_positive"
kiki
Дата: 29.06.2004 17:33:40
огромное спасибо, именно то что я искал