- 我不明白为什么不在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
我不明白什么不PSQL TRIGER UPDATA –
更新工作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