2016-12-12 23 views
1

- 我不明白为什么不在psql触发器更新中工作。我不明白为什么不能在psql触发器更新中工作

DROP TABLE IF EXISTS sklady CASCADE; 
    CREATE TABLE sklady (
     nomer_sklada integer NOT NULL, 
     familia_otvetsvennogo_lica varchar(32) NOT NULL, 
     CONSTRAINT sklady_pk PRIMARY KEY (nomer_sklada) 
     ); 

DROP TABLE IF EXISTS ythet_otgruzki_gotovoq_produkcii CASCADE; 
CREATE TABLE ythet_otgruzki_gotovoq_produkcii (
    nomer_sklada integer NOT NULL, 
    nomer_dokumenta_otgryzki serial NOT NULL, 
    cod_pokypatela integer NOT NULL, 
    cod_gotovogo_izdekiz integer NOT NULL, 
    edinica_izmerenia varchar(32) NOT NULL, 
    kolichestvo integer DEFAULT 1 CHECK(kolichestvo >= 1), 
    data_otgruzki DATE NOT NULL, 
    CONSTRAINT ythet_otgruzki_gotovoq_produkcii_pk PRIMARY KEY (nomer_dokumenta_otgryzki) 
    ); 


ALTER TABLE ythet_otgruzki_gotovoq_produkcii ADD CONSTRAINT ythet_otgruzki_gotovoq_produkcii_fk0 FOREIGN KEY (nomer_sklada) REFERENCES sklady(nomer_sklada); 

---- ----更新

CREATE OR REPLACE FUNCTION func_triger_update() RETURNS trigger 
AS $$ 
BEGIN 
UPDATE ythet_otgruzki_gotovoq_produkcii SET nomer_sklada = NEW.nomer_sklada 
WHERE nomer_sklada = OLD.nomer_sklada; 
RETURN NEW; 
END; $$ 
LANGUAGE plpgsql; 

DROP TRIGGER IF EXISTS trigger_update ON sklady; 
CREATE TRIGGER trigger_update 
BEFORE UPDATE ON sklady 
FOR EACH ROW EXECUTE PROCEDURE func_triger_update(); 

----插入----

INSERT INTO sklady(nomer_sklada, familia_otvetsvennogo_lica) VALUES 
    (0, 'first'), 
    (1, 'second'), 
    (2, 'thred'); 



INSERT INTO ythet_otgruzki_gotovoq_produkcii(
      nomer_sklada, nomer_dokumenta_otgryzki, cod_pokypatela, cod_gotovogo_izdekiz, 
      edinica_izmerenia, kolichestvo, data_otgruzki) VALUES 
    (0, 0, 0, 3, 'gram', 200, '2016-10-01'), 
    (1, 1, 1, 1, 'kilogram', 22, '2016-10-07'), 
    (1, 2, 2, 0, 'kilogram', 123, '2016-10-05'), 
    (0, 3, 3, 2, 'gram', 14, '2016-10-01'), 
    (2, 4, 4, 2, 'gram', 14, '2016-10-01'), 
    (2, 5, 5, 4, 'gram', 199, '2016-11-22'); 

UPDATE sklady SET nomer_sklada = 3 WHERE nomer_sklada = 0; 

错误:

ERROR: insert or update on table "ythet_otgruzki_gotovoq_produkcii" violates foreign key constraint "ythet_otgruzki_gotovoq_produkcii_fk0"

DETAIL: Key (nomer_sklada)=(3) is not present in table "sklady".

CONTEXT: SQL statement "UPDATE ythet_otgruzki_gotovoq_produkcii SET nomer_sklada = NEW.nomer_sklada WHERE nomer_sklada = OLD.nomer_sklada" PL/pgSQL function func_triger_update() line 3 at SQL statement

+0

我不明白什么不PSQL TRIGER UPDATA –

+0

更新工作sklady SET nomer_sklada = 3 WHERE nomer_sklada = 0; 错误:插入或更新表“ythet_otgruzki_gotovoq_produkcii”违反了外键约束“ythet_otgruzki_gotovoq_produkcii_fk0” 细节:键(nomer_sklada)=(3)不存在于表“sklady”中。 CONTEXT:SQL语句“UPDATE ythet_otgruzki_gotovoq_produkcii SET nomer_sklada = NEW.nomer_sklada WHERE nomer_sklada = OLD.nomer_sklada” PL/pgSQL函数func_triger_update()第3行在SQL语句 – Rustam

回答

0

你有外键ythet_otgruzki_gotovoq_produkcii_fk0这resticts设置nomer_sklada的值为,因为此列引用表sklady,相同的列名称。这是写在错误的详细信息:

DETAIL: Key (nomer_sklada)=(3) is not present in table "sklady".

如果你运行像水木清华

INSERT INTO sklady(nomer_sklada, familia_otvetsvennogo_lica) VALUES (3,'chetvertyj'); 

报价更新将不会上升错误

相关问题