2015-05-14 39 views
1

我正在嘗試創建更新表視圖創建更新視圖sql錯誤規則

我有表product, category, product_has_category

CREATE TABLE "category" (
"category_id" SERIAL NOT NULL, 
"name" varchar(15) NOT NULL, 
"description" varchar(150) NOT NULL, 
PRIMARY KEY("category_id") 
); 

CREATE TABLE "product" (
"product_id" SERIAL NOT NULL, 
"name" varchar(20) NOT NULL, 
"price" int4 NOT NULL, 
"description" varchar(200), 
"country_of_origin" varchar(20) NOT NULL, 
PRIMARY KEY("product_id") 
); 


CREATE TABLE "product_has_category" (
"NMID" SERIAL NOT NULL, 
"product_id" int4 NOT NULL, 
"category_id" int4 NOT NULL 
); 

ALTER TABLE "product_has_category" 
ADD CONSTRAINT "Ref_Product_has_Category_to_Product" FOREIGN KEY ("Product_product_id") 
REFERENCES "Product"("product_id") 
MATCH SIMPLE 
ON DELETE CASCADE 
ON UPDATE CASCADE 
NOT DEFERRABLE; 

這裏是認爲選擇產品,它的價格和類別:

CREATE VIEW products_with_categories AS 
SELECT product.name AS product_name, product.price, category.name AS  category 
FROM product, category, product_has_category 
WHERE product_has_category.product_id = product.product_id AND 
product_has_category.category_id = category.category_id 
ORDER BY product_name; 

我想以可更新和創建的規則:

CREATE RULE prod_cat_upd AS ON UPDATE TO products_with_categories 
DO INSTEAD 
UPDATE product 
    SET product.name=NEW.product.name 
WHERE product.name=OLD.product.name 

而且我得到了以下錯誤:

invalid reference to FROM-clause entry for table "product" Hint: There is an entry for table "product", but it cannot be referenced from this part of the query.

我不明白這個錯誤意味着什麼以及如何解決這個問題。

+0

回到您的舊問題,並接受答案,如果有所幫助。因爲你現在從你問的11個問題中,只有一個你接受了。一個沒有答案(重複),其他9個問題有答案,但你不接受也不upvote他們,所以嘗試接受答案,如果這有助於你 – HaveNoDisplayName

回答

2

試試這個語法建立的規則,Refer

CREATE RULE prod_cat_upd AS ON UPDATE TO products_with_categories 
DO INSTEAD 
UPDATE product 
     SET name=NEW.name 
WHERE name=OLD.name 

我創建了兩個SQL撥弄樣品表

1)Sample SQL FIDDLE與解決方案的更多資料,我公司提供: - 做工精細

CREATE TABLE shoelace_data (
    sl_name text,   -- primary key 
    sl_avail integer,  -- available number of pairs 
    sl_color text,   -- shoelace color 
    sl_len  real,   -- shoelace length 
    sl_unit text   -- length unit 
); 

CREATE TABLE unit (
    un_name text,   -- primary key 
    un_fact real   -- factor to transform to cm 
); 

CREATE VIEW shoelace AS 
    SELECT s.sl_name, 
      s.sl_avail, 
      s.sl_color, 
      s.sl_len, 
      s.sl_unit, 
      s.sl_len * u.un_fact AS sl_len_cm 
     FROM shoelace_data s, unit u 
    WHERE s.sl_unit = u.un_name; 

CREATE RULE shoelace_upd AS ON UPDATE TO shoelace 
    DO INSTEAD 
    UPDATE shoelace_data 
     SET sl_name = NEW.sl_name, 
      sl_avail = NEW.sl_avail, 
      sl_color = NEW.sl_color, 
      sl_len = NEW.sl_len, 
      sl_unit = NEW.sl_unit 
    WHERE sl_name = OLD.sl_name; 

2)您對CREATE RULE的代碼: - 失敗並具有相同的呃ROR你會得到什麼

不工作

CREATE RULE shoelace_upd AS ON UPDATE TO shoelace 
    DO INSTEAD 
    UPDATE shoelace_data 
     SET shoelace_data.sl_name = NEW.shoelace_data.sl_name, 
      shoelace_data.sl_avail = NEW.shoelace_data.sl_avail, 
      shoelace_data.sl_color = NEW.shoelace_data.sl_color, 
      shoelace_data.sl_len = NEW.shoelace_data.sl_len, 
      shoelace_data.sl_unit = NEW.shoelace_data.sl_unit 
    WHERE shoelace_data.sl_name = OLD.shoelace_data.sl_name; 

編輯: - 您收到此錯誤: -

ERROR: column new.name does not exist

因爲你的觀點並沒有 '名稱' 作爲現場,你的觀點只有這三個字段: - product_name, price and category所以只使用這些字段

CREATE RULE prod_cat_upd AS ON UPDATE TO products_with_categories 
DO INSTEAD 
UPDATE product 
     SET name=NEW.product_name 
WHERE name=OLD.product_name 
+0

我看到你的代碼和OP之間唯一的區別是格式。我錯過了什麼? –

+0

看到,有點不同.... OP使用列名稱的表名,並不需要根據文檔,並且OP缺少 – HaveNoDisplayName

+0

@Piyush我嘗試了正確的語法,但得到了錯誤:錯誤:列new.name不存在 – user2950602