我想知道是否可以根據另一個表中另一列的值在列上創建具有非空約束的表。(在 postgres 中)
例子:
CREATE TABLE IF NOT EXISTS Ref (
id SERIAL PRIMARY KEY,
required BOOLEAN DEFAULT FALSE
);
CREATE TABLE IF NOT EXISTS Value (
id SERIAL PRIMARY KEY,
refId INTEGER REFERENCES Ref(id) NOT NULL,
value TEXT,
);
因此,如果需要為 TRUE,我想在這里向值添加一個 NOT NULL 約束。
所以我嘗試使用一些檢查,但它似乎只檢查同一個表中的列:(。
提前致謝。
uj5u.com熱心網友回復:
我明白當required欄位等于真時,那么我們必須將 NOT NULL 設定為Value表的欄位,否則設定為必須為 NULL。您可以使用 PostgreSQL 檢查約束來做到這一點。首先,我們必須創建一個用于檢查欄位值的函式。
CREATE OR REPLACE FUNCTION get_required(p_id integer, p_value text)
RETURNS BOOLEAN AS
$$
declare
v_ret bool;
begin
select required into v_ret from tbl_ref where id = p_id;
if (v_ret)and(p_value is null) then
return false;
end if;
return true;
END;
$$ LANGUAGE PLpgSQL;
然后我們就可以在創建表的程序中使用這個函式:
CREATE TABLE tbl_val (
id serial4 NOT NULL,
ref_id int4 NOT NULL,
"value" text NULL,
CONSTRAINT tbl_val_check CHECK (get_required(ref_id, "value")),
CONSTRAINT tbl_val_pkey PRIMARY KEY (id),
CONSTRAINT tbl_val_fk FOREIGN KEY (ref_id) REFERENCES tbl_ref(id)
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/366800.html
標籤:数据库 PostgreSQL的 背部
