我正在尝试维护一个地址历史表:
CREATE TABLE address_history (
    person_id int, 
    sequence int,
    timestamp datetime default current_timestamp,
    address text,
    original_address text,
    previous_address text,
    PRIMARY KEY(person_id, sequence),
    FOREIGN KEY(person_id) REFERENCES people.id
);
我想知道是否有一种简单的方法可以自动编号/约束sequence,address_history从而自动从1开始计数person_id.
换句话说,第一行person_id = 1会得到sequence = 1; person_id = 1会得到第二排sequence = 2.第一行person_id = 2,将sequence = 1再次获得.等等.
还有更好/内置的方式来维护这样的历史吗?
我正在使用Grails 3.0.7和Postgres 9.2.我对Postgres很新,所以这可能是一个愚蠢的问题.如何正确地将id生成器序列与表关联?我在某处读到,如果您创建一个具有serial数据类型的id列的表,那么它将自动为该表创建一个序列.
但是,该列似乎是使用某种类型创建的bigint.如何让Grails创建具有bigserial数据类型的列,这甚至可以解决我的问题?如果我想要每个表一个序列怎么办?我只是不确定如何设置它,因为我过去从未真正使用过Postgres.
我有一个定义相互递归表的模型:
Answer
  questionId QuestionId
  text
Question
  text
  correct AnswerId
实际插入问题需要做什么?我需要先知道正确答案是什么.但要插入答案,我需要知道它回答了什么问题.
如果重要的话,我正在运行Postgres.
DDL是:
CREATE TABLE answer (
  id integer NOT NULL,                -- answer id
  text character varying NOT NULL,    -- answer text
  question_id bigint NOT NULL         -- question id
);
CREATE TABLE question (
  id integer NOT NULL,                 -- question id
  question character varying NOT NULL, -- question text
  correct bigint NOT NULL,             -- correct answer
  solution character varying NOT NULL  -- solution text
);
ALTER TABLE ONLY answer ALTER COLUMN …sql postgresql database-design referential-integrity foreign-keys
ID | info
---------
1  | xxx
2  | xxx
4  | xxx
我在 PostgreSQL 中有一个与此类似的设置。(如果有区别的话,我使用的是运行Mojave的mac)。
我还有几列,但问题是ID列。这被设置为顺序的,所以使用 Express 我插入到数据库中。
问题是,它会增加ID每个插入甚至失败的插入。info已定义unique,因此尝试插入现有会info返回错误。但是ID还是递增。
例如,如果我插入 2 行,我有id 1& id 2。然后另一个因唯一违规而失败。下一个成功的插入获取id = 4,跳过id = 3。
我可以设置 Postgres 使其不会在插入失败时增加吗?
我在 PostgreSQL 中创建了这个 PL/pgSQL 触发器函数:
CREATE or replace FUNCTION public.trigger31()
        RETURNS trigger
        LANGUAGE 'plpgsql'
        COST 100
        VOLATILE NOT LEAKPROOF 
    AS $BODY$
    begin
        if(TG_OP='INSERT') then
            if(New.start_date>(select max(end_date) from "Semester") and New.end_date>New.start_date) then
                Insert Into "Semester" (semester_id,academic_year,academic_season,start_date,end_date,semester_status)
                values (New.semester_id=(select max(s.semester_id)+1 from "Semester" s):: integer,
                        new.academic_year= academic_year_trig(),
                        new.academic_season=academic_season_trig(),
                        new.start_date,new.end_date,
                        new.semester_status=semester_stat_trig()
                    );
                return NEW;
            else
                RAISE EXCEPTION 'Invalid start_date or end_date';
            end if;
        end if;
    end;
$BODY$;
尝试执行它,我收到此错误:
Run Code Online (Sandbox Code Playgroud)ERROR: column "semester_id" is of type integer but expression is of type boolean LINE 2: values …
postgresql plpgsql auto-increment database-trigger sql-insert
我在 Postgres 10.10 中有下表:
  Table "public.client"
       Column        |  Type   | Collation | Nullable |                 Default                  
---------------------+---------+-----------+----------+------------------------------------------
 clientid            | integer |           | not null | nextval('client_clientid_seq'::regclass)
 account_name        | text    |           | not null | 
 last_name           | text    |           |          | 
 first_name          | text    |           |          | 
 address             | text    |           | not null | 
 suburbid            | integer |           |          | 
 cityid              | integer |           |          | 
 post_code           | integer |           | not null | 
 business_phone      | text    |           |          | 
 home_phone …PostgreSQL中存在smallserial,serial和bigserial数值数据类型,它们分别对 32767、2147483647 和 9223372036854775807 有明显的限制。
但是呢GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY,它有什么限制吗?或者也许它们是根据提供的数据类型(SMALLINT, INT, BIGINT)计算的?
我在 PostgreSQL 中有一个表,它有一个应该是唯一的 ID 列。然而,当前大量行(大约 300 万行)的 ID 为“1”。
我知道的:
我需要的是一个查询,它将提取 ID 为“1”的所有行,并为它们分配一个自动递增的新 ID,以便表中的每一行都具有唯一的 ID。我希望它从 开始,currentMaxId + 1并为每一行分配后续 ID。
这是我通过查询得到的最接近的结果:
UPDATE table_name
SET id = (
    SELECT max(id) FROM table_name
) + 1
WHERE id = '1'
这样做的问题是,内部 SELECT 仅在第一次运行,因此将相关行的 ID 设置为原始的max(id) + 1,而不是每次都设置为新的max(id) + 1,这给了我想要解决的相同问题。
任何有关如何调整此查询以实现我想要的结果或替代方法的建议将不胜感激!
我有一个名为 的表pivot_device_user,并且 id 上有一个序列为not null default nextval('pivot_device_user_id_seq'::regclass)。
然后我决定将我的表重命名为pivot_box_user,但nextval(...)仍然如此nextval('pivot_device_user_id_seq'::regclass)。
我想把它改成nextval('pivot_box_user_id_seq'::regclass). 我该怎么做呢?
我正在使用PostgreSQL设置所有表格.我目前有一个名comments为主键的表,comment_id其名称VARCHAR长度为4.
我有一个表单设置插入一个新的注释到数据库但我很困惑,我将如何从我之前的值获取我的Java servlet ++_ comment_id.例如0001到0002.
如果在 SQL Server 中我们有一个自动增量的表,有 10 行,最后一行有id = 10. 当你删除最后一行时,你插入的下一行也会得到id = 10,对吧?
但在 Postgres 中,使用bigserialas PK 时,当我删除具有 max 的行id并插入新行时,它会不断增加 pk 数。
是对的吗?
我有两张桌子:国家和地区.
CREATE TABLE Countries(
    id     SERIAL,
    name   VARCHAR(40) NOT NULL,
    PRIMARY KEY(id)
)
CREATE TABLE Regions(
    id           SERIAL,
    countryId    SERIAL,
    name         VARCHAR(40) NOT NULL,
    PRIMARY KEY(id       ),
    FOREIGN KEY(countryId) REFERENCES Countries(id)
)
当我插入区域时,我希望如果我没有提到countryId,我会被停止,但是,countryId会自动增加.有什么方法可以自动停止进行插入吗?
下面的表格,我设置countryID为SERIAL NOT NULL不解决问题.
CREATE TABLE Pigeons(
    id           SERIAL,
    countryId    SERIAL NOT NULL,
    name         VARCHAR(40) NOT NULL,
    PRIMARY KEY(id       ),
    FOREIGN KEY(countryId) REFERENCES Countries(id)
)
以下解决了这个问题,但我认为它在技术上是不正确的,因为我的序列可能大于2 ^ 31,但int永远不会> = 2 ^ 31.
CREATE TABLE Legions(
    id           SERIAL,
    countryId    INT NOT …在MySQL中,我能够做到
INSERT INTO table_name (column_name1, column_name2) VALUES('John', 'Doe);
如您所见,我不必提及ID,我将如何在postgreSQL中做到这一点。
谢谢
postgresql ×13
sql ×6
ddl ×2
sequence ×2
database ×1
express ×1
foreign-keys ×1
grails ×1
identity ×1
java ×1
key ×1
macos ×1
mysql ×1
node.js ×1
plpgsql ×1
servlets ×1
sql-insert ×1
sql-update ×1