2017-03-14 33 views
0

我正在製作一個sql腳本,所以我創建了表格,現在我有一個新的表格有列。一列有一個FOREIGN KEY,所以我需要將此值設置爲原始表值的值爲SET DEFAULT。例如考慮這兩個表來自另一個表的Postgresql SET DEFAULT值SQL

PERSON(姓名,姓氏,ID,年齡);

僱主(姓名,姓氏,部門,年齡);

在僱主中,我需要將年齡設置爲Person年齡的默認值,這隻有當Person有行或只有1行時。

ID姓氏,部門主鍵僱主和年齡在僱主外鍵從人

refferenced

例如,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'?? 
); 
+1

不要存儲相同的數據兩次... – jarlh

+0

但我必須這樣做。 –

+0

請解釋你爲什麼要這樣做? – jarlh

回答

1

使用觸發而不是默認。我已經做了這樣的事情(偶爾有用於彙總全文向量等)。

您不能在此處使用默認值,因爲您無權訪問當前行數據。因此,如果取決於您當前正在保存的值,則無法查找。

相反,您希望創建一個BEFORE觸發器,該觸發器在未設置值的情況下設置該值,並查找數據。請注意,這具有不同的限制,因爲DEFAULT查看查詢(是指定的值),而觸發器查看該值(即,當前行的外觀如何)。因此,可以通過顯式傳入NULL來避免默認值。但無論如何,觸發器都會填充。

2

拿掉這個練習中糟糕的設計選擇,可以使用觸發器將列的值分配給另一列。

粗糙工作下面的例子:

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