创建更新视图sql的规则时出错
我正在尝试创建UpdaeTable视图 我有表创建更新视图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
产品,类别,产品\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个问题有答案,但你们不接受也不投票,所以试着接受答案,如果这对你们有帮助的话