1
我在PostgreSQL中使用觸發器創建條形碼時遇到問題。問題是,當客戶端訪問我的Web應用程序並在同一時間插入數據時,我需要在我的一些目標項目中生成條形碼。但問題是Auto生成的條形碼是Duplicate。任何解決方案,請幫助我。格式條碼是:。 這是我的觸發器:使用觸發器在PostgreSQL中重複自動增量生成字段
DROP TABLE IF EXISTS "test"."barcode";
CREATE TABLE "test"."barcode" (
"id" int8 DEFAULT nextval('"test".t_id_seq'::regclass) NOT NULL,
"barcode" varchar(255) COLLATE "default"
)
WITH (OIDS=FALSE);
-----------------------------------------
CREATE OR REPLACE FUNCTION test.my_trigger_function()
RETURNS trigger AS
$BODY$DECLARE new_barcode CHAR(50);
BEGIN
SELECT
(CASE
WHEN
CHAR_LENGTH (CAST(CAST(SUBSTRING(barcode, 5, 9) AS INTEGER) + 1 AS CHAR(20))) = 1 THEN
(SUBSTRING(barcode, 1, 4) || '00000000' || CAST((CAST(SUBSTRING(barcode, 5, 9) AS INTEGER) + 1) AS CHAR(20)))
WHEN
CHAR_LENGTH (CAST(CAST(SUBSTRING(barcode, 5, 9) AS INTEGER) + 1 AS CHAR(20))) = 2 THEN
(SUBSTRING(barcode, 1, 4) || '0000000' || CAST((CAST(SUBSTRING(barcode, 5, 9) AS INTEGER) + 1) AS CHAR(20)))
WHEN
CHAR_LENGTH (CAST(CAST(SUBSTRING(barcode, 5, 9) AS INTEGER) + 1 AS CHAR(20))) = 3 THEN
(SUBSTRING(barcode, 1, 4) || '000000' || CAST((CAST(SUBSTRING(barcode, 5, 9) AS INTEGER) + 1) AS CHAR(20)))
WHEN
CHAR_LENGTH (CAST(CAST(SUBSTRING(barcode, 5, 9) AS INTEGER) + 1 AS CHAR(20))) = 4 THEN
(SUBSTRING(barcode, 1, 4) || '00000' || CAST((CAST(SUBSTRING(barcode, 5, 9) AS INTEGER) + 1) AS CHAR(20)))
WHEN
CHAR_LENGTH (CAST(CAST(SUBSTRING(barcode, 5, 9) AS INTEGER) + 1 AS CHAR(20))) = 5 THEN
(SUBSTRING(barcode, 1, 4) || '0000' || CAST((CAST(SUBSTRING(barcode, 5, 9) AS INTEGER) + 1) AS CHAR(20)))
WHEN
CHAR_LENGTH (CAST(CAST(SUBSTRING(barcode, 5, 9) AS INTEGER) + 1 AS CHAR(20))) = 6 THEN
(SUBSTRING(barcode, 1, 4) || '000' || CAST((CAST(SUBSTRING(barcode, 5, 9) AS INTEGER) + 1) AS CHAR(20)))
WHEN
CHAR_LENGTH (CAST(CAST(SUBSTRING(barcode, 5, 9) AS INTEGER) + 1 AS CHAR(20))) = 7 THEN
(SUBSTRING(barcode, 1, 4) || '00' || CAST((CAST(SUBSTRING(barcode, 5, 9) AS INTEGER) + 1) AS CHAR(20)))
WHEN
CHAR_LENGTH (CAST(CAST(SUBSTRING(barcode, 5, 9) AS INTEGER) + 1 AS CHAR(20))) = 8 THEN
(SUBSTRING(barcode, 1, 4) || '0' || CAST((CAST(SUBSTRING(barcode, 5, 9) AS INTEGER) + 1) AS CHAR(20)))
WHEN
CHAR_LENGTH (CAST(CAST(SUBSTRING(barcode, 5, 9) AS INTEGER) + 1 AS CHAR(20))) = 9 THEN
(SUBSTRING(barcode, 1, 4) || CAST((CAST(SUBSTRING(barcode, 5, 9) AS INTEGER) + 1) AS CHAR(20)))
ELSE
(CAST((CAST(TO_CHAR(NOW(),'yyyy') AS INTEGER)+1) AS CHAR(20)) || '000000001')
END
) INTO new_barcode
FROM
test. barcode
ORDER BY
id DESC
LIMIT 1;
IF new_barcode IS NULL THEN
new_barcode = (CAST(TO_CHAR(NOW(),'yyyy') AS CHAR(20)) || '000000001');
END IF;
NEW.barcode = new_barcode;
RETURN NEW;
END;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION test.my_trigger_function()
OWNER TO postgres;
--------------------------------------------------
CREATE TRIGGER "my_trigger" BEFORE INSERT ON "test"."barcode"
FOR EACH ROW
EXECUTE PROCEDURE "test"."my_trigger_function"();
它的工作原理。謝謝! – munyso