我正在创建一个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'??
);
答案 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来避免默认值。但无论如何都会触发一个触发器。