我无法理解为什么不在psql触发器更新工作

时间:2016-12-12 15:30:05

标签: 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;

错误:

  

错误:在表格上插入或更新" ythet_otgruzki_gotovoq_produkcii"违反外键约束" ythet_otgruzki_gotovoq_produkcii_fk0"

     

详细信息:表格中没有键(nomer_sklada)=(3)" sklady"。

     

CONTEXT:SQL语句"更新ythet_otgruzki_gotovoq_produkcii SET nomer_sklada = NEW.nomer_sklada       在哪里nomer_sklada = OLD.nomer_sklada"       PL / pgSQL函数func_triger_update()在SQL语句的第3行

1 个答案:

答案 0 :(得分:0)

你有一个外键 ythet_otgruzki_gotovoq_produkcii_fk0 ,它将nomer_sklada的值设置为 3 ,因为此列引用表 sklady ,相同的列名。这是以错误细节编写的:

  

详细信息:表格中没有键(nomer_sklada)=(3)" sklady"。

如果你像

那样运行smth
INSERT INTO sklady(nomer_sklada, familia_otvetsvennogo_lica) VALUES (3,'chetvertyj');

引用更新不会引发错误