来自另一个表SQL

时间:2017-03-14 09:44:00

标签: sql postgresql

我正在创建一个sql脚本,所以我创建了表,现在我有了一个包含列的新表。一列有一个FOREIGN KEY所以我需要这个值是原始表值的SET DEFAULT。例如,考虑这两个表

PERSON(名称,Surename,的 ID 下,年龄);

EMPLOYER(名称,的姓,扇区下,年龄);

在雇主我需要AGE在Person的AGE上默认设置,这仅在PERSON有行或只有1行时才有效。

ID 人员的主键,雇主姓氏,部门,雇主的AGE是FOREIGN KEY从人物中反思

示例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'??
);

2 个答案:

答案 0 :(得分:3)

除去本练习的糟糕设计选择,可以使用触发器将列的值分配给另一列的值。

下面的粗略工作示例:

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();

答案 1 :(得分:1)

使用触发器而不是默认值。我做过这样的事情(偶尔用于汇总全文本向量等)。

您无法在此处使用默认值,因为您无法访问当前行数据。因此,如果它取决于您当前保存的值,则无需查找。

相反,您希望创建一个BEFORE触发器,如果​​未设置该值,则会设置该值,并查找数据。请注意,这有不同的限制,因为DEFAULT查看查询(是指定的值),而触发器查看该值(即当前行的外观如何)。因此,可以通过显式传入NULL来避免默认值。但无论如何都会触发一个触发器。