2017-03-16 36 views
-1

我不得不簡單地將數據從一個表複製到動態生成的表中。我創建觸發器的..創建觸發器,用於將數據從一個表複製到postgresql中的動態生成表中

CREATE OR REPLACE FUNCTION historylogfunc() RETURNS TRIGGER AS $example_table$  
    DECLARE last_device_id text; 
    BEGIN 
     PERFORM last_device_id = device_id FROM company ORDER BY id DESC LIMIT 1;   
    INSERT INTO "device_id"(emp_id, entry_date, name) VALUES (new.id, current_timestamp, new.name); 
     RETURN NEW; 
    END; 
$example_table$ LANGUAGE plpgsql; 

PERFORM last_device_id = device_id FROM company ORDER BY id DESC LIMIT 1; 

它將VAR最後device_id選擇表和存儲最後device_id
假設device_id = dv001,

我必須從主表複製數據到新表,即dv001。

錯誤顯示:關係「device_id」不存在。

請幫我...

+0

當然不是 - 你想插入到表中而不是字符串 –

+0

你不能「插入」到列中。您插入**表** –

+0

PERFORM last_device_id = device_id FROM公司ORDER BY id DESC LIMIT 1;此查詢計算device_id列的最後一個值。每個表都存在於device_id列中的每個新條目中。現在我想在運行時複製數據。 – Ashish

回答

0

我看到兩個問題你的函數:

  1. PERFORM last_device_id = device_id FROM company ORDER BY id DESC LIMIT 1;

    • 這是相同的SELECT last_device_id = device_id FROM company ...;,除了結果會被丟棄。 所以這個說法什麼都不做,因爲它沒有副作用。這不能被打算。

    • SELECT last_device_id = device_id ...的(丟棄)的結果是比較操作符=boolean結果。這是你的意圖嗎?

  2. INSERT INTO "device_id"(emp_id, entry_date, name) VALUES (new.id, current_timestamp, new.name);

    這將導致該錯誤消息,因爲沒有表稱爲device_id。你確定有這個名字的表嗎?然後,如果它不在search_path中,則可能必須使用模式名稱對其進行限定。 但device_id看起來更像是一個列名,而不是表名。

在下面註釋的光:

如果你想INSERT到表中,其名稱是在company最新device_id項,你必須使用動態SQL類似如下:

SELECT device_id INTO last_device_id 
    FROM company 
    ORDER BY id DESC 
    LIMIT 1; 
EXECUTE 'INSERT INTO ' || quote_ident(last_device_id) 
     || ' (emp_id, entry_date, name) VALUES ($1, $2, $3)' 
    USING new.id, current_timestamp, new.name; 
+0

device_id是main_tbl中的列名稱,現在當新條目出現時在main_tbl中,然後使用該device_id值創建新表。假設帶有device_id = dv005的新條目插入到main_tbl中,那麼它將創建名稱爲dv005的新表。它由第三方創建,因此我必須簡單地從main_tbl中複製數據到新創建的表.. – Ashish

+0

@Ashish:爲什麼你想創建一個新的表,每次插入main_table行?這沒有任何意義。 (另外:'insert'不會創建一個新表,你需要'create table')你究竟在做什麼?你正試圖解決的**真正**問題是什麼? –

+0

是的,我知道他們是沒有意義的每次創建新表。但這是要求..它已經完成..現在我只需要將數據複製到新創建的表..新創建的表名稱與device_id列中的值完全相同。 – Ashish