Postgresql

複合類型的約束

  • June 5, 2018

如何在復合類型的子欄位上創建約束?

虛擬碼

create type axis(
   major_axis float,
   minor_axis float,
   angle float constraint angle_constraint check(angle between -90 and 90)
);

create table sample(
   axis1 axis,
   axis2 axis
);

這在 PostgreSQL 9.2 中可行嗎?如此處所述,在 9.1 中似乎是不可能

將 CREATE DOMAIN 與 CHECK 約束一起使用。這適用於 PostgreSQL 9.1。它被記錄在至少 8.0 + 中工作。“部分解決方法是使用域類型作為複合類型的成員。”

create domain angle as float check (value between -90 and 90);

create type axis as (
   major_axis float,
   minor_axis float,
   angle angle
);

create table sample(
   axis1 axis,
   axis2 axis
);

此 INSERT 語句應該成功。

insert into sample values
(row(0, 0, 35), row(0, 0, 35));

但是這個應該失敗。

insert into sample values
(row(0, 0, 93), row(0, 0, 35));
ERROR: value for domain angle violates check constraint "angle_check"
SQL state: 23514

引用自:https://dba.stackexchange.com/questions/46758