Postgresql从另一个表SQL设置默认值
我正在制作一个sql脚本,以便创建表,现在我有了一个包含列的新表。一列有外键,所以我需要将该值设置为原始表的默认值。例如,考虑这两个表 人员(姓名、确定姓名、身份证、年龄) 雇主(姓名、姓氏、行业、年龄) 在Employer中,我需要将年龄设置为默认的人的年龄,只有当人有行或只有一行时才需要设置 ID是个人的主键,雇主的姓氏、部门,和年龄是从个人引用的雇主的外键 sql示例:Postgresql从另一个表SQL设置默认值,sql,postgresql,Sql,Postgresql,我正在制作一个sql脚本,以便创建表,现在我有了一个包含列的新表。一列有外键,所以我需要将该值设置为原始表的默认值。例如,考虑这两个表 人员(姓名、确定姓名、身份证、年龄) 雇主(姓名、姓氏、行业、年龄) 在Employer中,我需要将年龄设置为默认的人的年龄,只有当人有行或只有一行时才需要设置 ID是个人的主键,雇主的姓氏、部门,和年龄是从个人引用的雇主的外键 sql示例: CREATE TABLE PERSON( name VARCHAR(30) , surename VAR
CREATE TABLE PERSON(
name VARCHAR(30) ,
surename VARCHAR(20),
ID VARCHAR(50) PRIMARY KEY,
Age INT NOT NULL,
);
CREATE TABLE EMPLOYER(
name VARCHAR(30) ,
Surename VARCHAR(20),
Sector VARCHAR(20),
Age INT NOT NULL,
PRIMARY KEY (Surename,Sector),
FOREIGN KEY (Age) REFERENCES Person(Age) //HERE SET DEFAULT Person(Age), how'??
);
使用触发器而不是默认值。我曾经做过类似的事情(偶尔对聚合全文向量有用) 您不能在此处使用默认值,因为您无权访问当前行数据。因此,如果它取决于当前保存的值,则无需查找
相反,您希望创建一个BEFORE触发器,如果未设置该触发器,它将设置该值,并查找数据。请注意,这有一个不同的限制,因为
DEFAULT
查看查询(是否指定了一个值),而触发器查看该值(即当前行的外观)。因此,可以通过显式传递NULL来避免默认值。但无论如何,触发器都会填充它。使用触发器而不是默认值。我曾经做过类似的事情(偶尔对聚合全文向量有用)
您不能在此处使用默认值,因为您无权访问当前行数据。因此,如果它取决于当前保存的值,则无需查找
相反,您希望创建一个BEFORE触发器,如果未设置该触发器,它将设置该值,并查找数据。请注意,这有一个不同的限制,因为
DEFAULT
查看查询(是否指定了一个值),而触发器查看该值(即当前行的外观)。因此,可以通过显式传递NULL来避免默认值。但是触发器将填充该列。除去此练习中糟糕的设计选择,可以使用触发器将一列的值指定给另一列的值
粗略的工作示例如下:
create table a (
cola int,
colb int) ;
create table b (
colc int,
cold int);
Create or replace function fn()
returns trigger
as $$ begin
if new.cold is null then
new.cold = (select colb from a where cola = new.colc);
end if;
return new;
end;
$$ language plpgsql;
CREATE TRIGGER
fn
BEFORE INSERT ON
b
FOR EACH ROW EXECUTE PROCEDURE
fn();
除去本练习中糟糕的设计选择,可以使用触发器将一列的值指定给另一列的值 粗略的工作示例如下:
create table a (
cola int,
colb int) ;
create table b (
colc int,
cold int);
Create or replace function fn()
returns trigger
as $$ begin
if new.cold is null then
new.cold = (select colb from a where cola = new.colc);
end if;
return new;
end;
$$ language plpgsql;
CREATE TRIGGER
fn
BEFORE INSERT ON
b
FOR EACH ROW EXECUTE PROCEDURE
fn();
不要存储相同的数据两次…但我必须这样做。请解释为什么必须这样做?在雇主表中将person id作为外键,并加入。我希望这是有道理的。年龄是雇主的外键,是从人身上参照的——什么?那没有任何意义。一点也不。不要存储相同的数据两次…但我必须这样做。请解释为什么你必须这样做?在雇主表中将个人id作为外键,并加入。我希望这是有道理的。年龄是雇主的外键,是从人身上参照的——什么?那没有任何意义。完全