Postgresql: разница между ограничением таблицы и ограничением столбца - PullRequest
4 голосов
/ 17 сентября 2011

Выдержка из документа pgsql 8.4: «[...] ограничение столбца является удобным условным обозначением для использования только тогда, когда ограничение влияет только на один столбец».Как этот действительный sql тогда?



DROP TABLE IF EXISTS test;
CREATE TABLE test(
id integer CONSTRAINT PK_test PRIMARY KEY  CONSTRAINT nenull NOT NULL CHECK (id3>=id2) 
--the check constraint affects two columns none of which is id
,id2 integer 
, id3 integer
);

выдержка, кажется, применяется только к ограничениям PRIMARY KEY и FOREIGN KEY, которые должны влиять только на столбец в той же строке, где ограничения объявлены, как указано в Catcall

Ответы [ 4 ]

4 голосов
/ 17 сентября 2011

В другом месте в документах .,.

Мы говорим, что первые два ограничения - это ограничения столбцов, а третье - ограничение таблиц, поскольку они записываются отдельно от любого определения одного столбца.Ограничения столбцов также могут быть записаны как ограничения таблиц, в то время как обратное не обязательно возможно, поскольку ограничение столбцов должно ссылаться только на столбец, к которому он присоединен.( PostgreSQL не применяет это правило , но вы должны следовать ему, если хотите, чтобы определения таблиц работали с другими системами баз данных.)

2 голосов
/ 23 сентября 2011

1) Ограничение уровня столбца объявляется во время создания таблицы, но ограничение уровня таблицы создается после создания таблицы.

2) NOT NULL ограничение не может быть создано на уровне таблицы , потому что All Constraint даст логическое представление этому конкретному столбцу, а NOT NULL назначит структуру самой таблицы. почему мы можем видеть ограничение NOT NULL при описании таблицы, никаких других ограничений не будет.

3) Составной первичный ключ должен быть объявлен на уровне таблицы .

4) Все ограничения могут быть созданы на уровне таблицы, но для Уровень таблицы NOT NULL не допускается.

1 голос
/ 27 декабря 2011

NOT NULL можно назначить даже после создания таблицы с помощью команды alter table. Я проверил это в oracle sql + 10g . Синтаксис, который я использовал, выглядит следующим образом: ALTER TABLE tablename MODIFY columnname NOTNULL;

Ожидаю от вас взгляда на это.

1 голос
/ 17 сентября 2011

Если ограничение внешнего ключа или ограничение первичного ключа покрывают только один столбец, вы можете написать его по-своему или как это:

CREATE TABLE test(
    id integer NOT NULL CHECK (id3>=id2),
    id2 integer,
    id3 integer,
    CONSTRAINT PK_test PRIMARY KEY(id, id2, id3)
);

Но если PK или FK покрывают более одного столбца, вы должны использовать «ограничение таблицы», как я вам показал.

За этим больше нет магии!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...