[英]creating insert, update rules in postgresql tables
我試圖用插入和更新規則創建一個postgresql表,該規則可以使用戶自動插入信息或更新數據庫表上的現有信息。 當我嘗試在數據庫中運行SQL查詢以創建表時,我不斷收到此錯誤。 我嘗試遵循PostgreSQL 9.1中的文檔步驟。 它一直使我的一個主鍵表達式出現錯誤,表明我需要重新編寫它。 請有人看看這個腳本並幫幫我。 感謝您最寶貴的貢獻!
這是我的SQL腳本
CREATE TABLE fieldtally1
(fieldtally1_id serial NOT NULL,
pipeno character varying,
wthick real,
heatno1 character varying(32),
pipeno2 character varying(32),
heatno2 character varying(32),
Djointno character varying(32),
ContractorNo character varying(32),
measuredlength double precision,
serialno character varying(32),
CoatingType character varying(32),
coatingno character varying(32),
mnfcno character varying(32),
FactoryLength double precision,
pipeod_in numeric,
pipeod_mm numeric,
pipeweight double precision,
pipegrade numeric,
loadtally numeric,
dateweilded date,
datereceived date,
dataenteredby character varying(50),
deliveryno character varying(50),
manufacturer character varying(50),
Remarks character varying(100),
ManualUser character varying(100),
log_when timestamp,
CONSTRAINT fieldtally1_pkey PRIMARY KEY (fieldtally1_id, pipeno)
);
Create rule fieldtally1_ins as on INSERT to fieldtally1
Do Instead
Insert into fieldtally1 values (
New.pipeno,
New.wthick,
New.heatno1,
New.pipeno2,
New.heatno2,
New.Djointno,
New.ContractorNo,
New.measuredlength,
New.serialno,
New.coatingtype,
New.coatingno,
New.mnfcno,
New.factorylength,
New.pipeod_in,
New.pipeod_mm,
New.pipeweight,
New.pipegrade,
New.ManualUser,
current_timestamp
);
CREATE RULE fieldtally1_upd AS ON UPDATE TO fieldtally1
DO INSTEAD
UPDATE fieldtally1
SET PIPENO = New.pipeno,
wthick = New.wthick,
heatno1 = New.heatno1,
pipeno2 = New.pipeno2,
heatno2 = New.heatno2,
Djointno = New.Djointno,
ContractorNo = New.ContractorNo,
measuredlength = New.measuredlength,
New.serialno = New.serialno,
coatingtype = New.coatingtype,
coatingno = New.coatingno,
mnfcno = New.mnfcno,
factorylength = New.factorylength,
pipeod_in = New.pipeod_in,
pipeod_mm = New.pipeod_mm,
pipeweight = New.pipeweight,
pipegrade = New.pipegrade,
ManualUser = New.ManualUser
WHERE pipeno = OLD.pipeno;
CREATE RULE fieldtally1_del AS ON DELETE TO fieldtally1
DO INSTEAD
DELETE FROM fieldtally1
WHERE pipeno = OLD.pipeno;
這是我運行腳本時遇到的錯誤
注意:CREATE TABLE將為串行列“ fieldtally1.fieldtally1_id”創建隱式序列“ fieldtally1_fieldtally1_id_seq”注意:CREATE TABLE / PRIMARY KEY將為表“ fieldtally1”創建隱式索引“ fieldtally1_pkey”錯誤:列“ fieldtally1_id”是整數類型,但表達式類型的字符類型隨行而異。LINE 34:New.pipeno,^提示:您將需要重寫或強制轉換表達式。
*** 錯誤 ** *
錯誤:“ fieldtally1_id”列的類型為整數,但表達式的類型因字符而異SQL狀態:42804提示:您將需要重寫或強制轉換表達式。 字元:1024
如果您的插入內容與該列不完全匹配,則需要指定它們。 您的更新包括一個“新”。 在serialno的左側:在http://sqlfiddle.com/#!1/c9ef3/1/0中有效
CREATE TABLE fieldtally
(fieldtally_id serial NOT NULL primary key,
pipeno character varying,
wthick real,
heatno1 character varying(32),
pipeno2 character varying(32),
heatno2 character varying(32),
Djointno character varying(32),
ContractorNo character varying(32),
measuredlength double precision,
serialno character varying(32),
CoatingType character varying(32),
coatingno character varying(32),
mnfcno character varying(32),
FactoryLength double precision,
pipeod_in numeric,
pipeod_mm numeric,
pipeweight double precision,
pipegrade numeric,
loadtally numeric,
dateweilded date,
datereceived date,
dataenteredby character varying(50),
deliveryno character varying(50),
manufacturer character varying(50),
Remarks character varying(100),
ManualUser text,
log_when timestamp
);
Create rule fieldtally_ins as on INSERT to fieldtally
Do Instead
Insert into fieldtally (pipeno, wthick, heatno1, pipeno2, heatno2, djointno, contractorno, measuredlength, serialno, coatingtype, coatingno,
mnfcno, factorylength, pipeod_in, pipeod_mm, pipeweight, pipegrade, manualuser, log_when) values (
New.pipeno,
New.wthick,
New.heatno1,
New.pipeno2,
New.heatno2,
New.Djointno,
New.ContractorNo,
New.measuredlength,
New.serialno,
New.coatingtype,
New.coatingno,
New.mnfcno,
New.factorylength,
New.pipeod_in,
New.pipeod_mm,
New.pipeweight,
New.pipegrade,
New.ManualUser,
current_timestamp
);
CREATE RULE fieldtally_upd AS ON UPDATE TO fieldtally
DO INSTEAD
UPDATE fieldtally
SET PIPENO = New.pipeno,
wthick = New.wthick,
heatno1 = New.heatno1,
pipeno2 = New.pipeno2,
heatno2 = New.heatno2,
Djointno = New.Djointno,
ContractorNo = New.ContractorNo,
measuredlength = New.measuredlength,
serialno = New.serialno,
coatingtype = New.coatingtype,
coatingno = New.coatingno,
mnfcno = New.mnfcno,
factorylength = New.factorylength,
pipeod_in = New.pipeod_in,
pipeod_mm = New.pipeod_mm,
pipeweight = New.pipeweight,
pipegrade = New.pipegrade,
ManualUser = New.ManualUser
WHERE pipeno = OLD.pipeno;
CREATE RULE fieldtally_del AS ON DELETE TO fieldtally
DO INSTEAD
DELETE FROM fieldtally
WHERE pipeno = OLD.pipeno;
用戶GO-因此sql在最后一次執行之前將不檢查評估
CREATE TABLE fieldtally
(fieldtally_id serial NOT NULL primary key,
pipeno character varying,
wthick real,
heatno1 character varying(32),
pipeno2 character varying(32),
heatno2 character varying(32),
Djointno character varying(32),
ContractorNo character varying(32),
measuredlength double precision,
serialno character varying(32),
CoatingType character varying(32),
coatingno character varying(32),
mnfcno character varying(32),
FactoryLength double precision,
pipeod_in numeric,
pipeod_mm numeric,
pipeweight double precision,
pipegrade numeric,
loadtally numeric,
dateweilded date,
datereceived date,
dataenteredby character varying(50),
deliveryno character varying(50),
manufacturer character varying(50),
Remarks character varying(100),
ManualUser text,
log_when timestamp
);
GO
Create rule fieldtally_ins as on INSERT to fieldtally
Do Instead
Insert into fieldtally values (
New.pipeno,
New.wthick,
New.heatno1,
New.pipeno2,
New.heatno2,
New.Djointno,
New.ContractorNo,
New.measuredlength,
New.serialno,
New.coatingtype,
New.coatingno,
New.mnfcno,
New.factorylength,
New.pipeod_in,
New.pipeod_mm,
New.pipeweight,
New.pipegrade,
New.ManualUser,
current_timestamp
);
GO
CREATE RULE fieldtally_upd AS ON UPDATE TO fieldtally
DO INSTEAD
UPDATE fieldtally
SET PIPENO = New.pipeno,
wthick = New.wthick,
heatno1 = New.heatno1,
pipeno2 = New.pipeno2,
heatno2 = New.heatno2,
Djointno = New.Djointno,
ContractorNo = New.ContractorNo,
measuredlength = New.measuredlength,
New.serialno = New.serialno,
coatingtype = New.coatingtype,
coatingno = New.coatingno,
mnfcno = New.mnfcno,
factorylength = New.factorylength,
pipeod_in = New.pipeod_in,
pipeod_mm = New.pipeod_mm,
pipeweight = New.pipeweight,
pipegrade = New.pipegrade,
ManualUser = New.ManualUser
WHERE pipeno = OLD.pipeno;
GO
CREATE RULE fieldtally_del AS ON DELETE TO fieldtally
DO INSTEAD
DELETE FROM fieldtally
WHERE pipeno = OLD.pipeno;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.