Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建更新视图sql的规则时出错_Sql_Postgresql - Fatal编程技术网

创建更新视图sql的规则时出错

创建更新视图sql的规则时出错,sql,postgresql,Sql,Postgresql,我正在尝试创建UpdaeTable视图 我有表产品,类别,产品\u有\u类别 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, "n

我正在尝试创建UpdaeTable视图

我有表
产品,类别,产品\u有\u类别

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
我得到了以下错误:

对表“product”的FROM子句条目的引用无效 提示:表“product”有一个条目,但不能从查询的这一部分引用它


我无法理解此错误的含义以及如何解决此问题。

请尝试使用此语法创建规则,以获取更多文档

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 FIDLE

1) 通过解决方案,我提供:-工作良好

    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 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;
编辑:- 您将收到以下错误:-

错误:列new.name不存在

因为您的视图没有“名称”作为字段,所以您的视图只有以下三个字段:-
产品名称、价格和类别
,所以只使用这些字段

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

我看到你的代码和OP的唯一区别就是格式。我错过了什么?看,有点不同。。。。OP使用带有列的表名,根据文档,这不是必需的,并且OPmissing@Piyush我尝试了正确的语法,但出现错误:错误:column new.name不存在exist@user2950602:-你能把你的新查询发到哪里出错吗?@Piyush创建规则prod\u cat\u upd作为更新到产品时的类别,改为更新产品集name=new.name其中name=OLD.name返回到你的旧问题,如果有帮助,接受答案。因为现在你问了11个问题,只有一个你接受了。一个没有答案(重复),另外9个问题有答案,但你们不接受也不投票,所以试着接受答案,如果这对你们有帮助的话