- 我无法理解为什么不在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行
答案 0 :(得分:0)
你有一个外键 ythet_otgruzki_gotovoq_produkcii_fk0 ,它将nomer_sklada的值设置为 3 ,因为此列引用表 sklady ,相同的列名。这是以错误细节编写的:
详细信息:表格中没有键(nomer_sklada)=(3)" sklady"。
如果你像
那样运行smthINSERT INTO sklady(nomer_sklada, familia_otvetsvennogo_lica) VALUES (3,'chetvertyj');
引用更新不会引发错误