Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql从另一个表SQL设置默认值_Sql_Postgresql - Fatal编程技术网

Postgresql从另一个表SQL设置默认值

Postgresql从另一个表SQL设置默认值,sql,postgresql,Sql,Postgresql,我正在制作一个sql脚本,以便创建表,现在我有了一个包含列的新表。一列有外键,所以我需要将该值设置为原始表的默认值。例如,考虑这两个表 人员(姓名、确定姓名、身份证、年龄) 雇主(姓名、姓氏、行业、年龄) 在Employer中,我需要将年龄设置为默认的人的年龄,只有当人有行或只有一行时才需要设置 ID是个人的主键,雇主的姓氏、部门,和年龄是从个人引用的雇主的外键 sql示例: CREATE TABLE PERSON( name VARCHAR(30) , surename VAR

我正在制作一个sql脚本,以便创建表,现在我有了一个包含列的新表。一列有外键,所以我需要将该值设置为原始表的默认值。例如,考虑这两个表

人员(姓名、确定姓名、身份证、年龄)

雇主(姓名、姓氏、行业、年龄)

在Employer中,我需要将年龄设置为默认的人的年龄,只有当人有行或只有一行时才需要设置

ID是个人的主键,雇主的姓氏、部门,和年龄是从个人引用的雇主的外键

sql示例:

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作为外键,并加入。我希望这是有道理的。年龄是雇主的外键,是从人身上参照的——什么?那没有任何意义。完全