我正在尝试建立一个博客系统,但遇到了一个小问题。简而言之,我的article表中有3列:id SERIAL,category VARCHAR FK,category_id INTid列显然是PK,它用作所有文章的全局标识符。category列是..类别。category_id在类别中用作UNIQUE ID,因此当前存在UNIQUE(category, category_id)约束。但是,我也希望category_id自动增加。我想要它,以便每次执行类似的查询时INSERT INTO article(category) VALUES ('stackoverflow');我希望根据“ stackoverflow”类别的最新category_id自动填充category_id列。在我的逻辑代码中实现此目标非常容易。我只选择了最新的num并插入+1,但这涉及两个单独的查询。我正在寻找一种可以在一个查询中完成所有这些操作的SQL解决方案。 最佳答案 概念至少有几种方法可以解决此问题。我想到的第一个:通过覆盖category_id语句的输入值,在为每行执行的触发器内为INSERT列分配值。行动这是SQL Fiddle来查看运行中的代码为了进行简单的测试,我创建了article表,其中包含类别以及每个id应当唯一的类别。我省略了约束创建-与提出要点无关。create table article ( id serial, category varchar, category_id int )使用category函数为两个不同的类别插入一些值,以使自动增量生效。insert into article(category, category_id) select 'stackoverflow', i from generate_series(1,1) i union all select 'stackexchange', i from generate_series(1,3) i创建一个触发函数,该函数将选择generate_series()并为MAX(category_id)将其值增加1,我们将在其中插入一行,然后在继续实际的category到表(触发器即可解决)。CREATE OR REPLACE FUNCTION category_increment()RETURNS triggerLANGUAGE plpgsqlAS$$DECLARE v_category_inc int := 0;BEGIN SELECT MAX(category_id) + 1 INTO v_category_inc FROM article WHERE category = NEW.category; IF v_category_inc is null THEN NEW.category_id := 1; ELSE NEW.category_id := v_category_inc; END IF;RETURN NEW;END;$$使用函数作为触发器。CREATE TRIGGER trg_category_increment BEFORE INSERT ON article FOR EACH ROW EXECUTE PROCEDURE category_increment()为已经存在的类别和不存在的类别插入更多值(触发器设备之后)。INSERT INTO article(category) VALUES ('stackoverflow'), ('stackexchange'), ('nonexisting');用于选择数据的查询:select category, category_id From article order by 1,2初始插入的结果:category category_idstackexchange 1stackexchange 2stackexchange 3stackoverflow 1最终插入后的结果:category category_idnonexisting 1stackexchange 1stackexchange 2stackexchange 3stackexchange 4stackoverflow 1stackoverflow 2
09-15 22:14