相关疑难解决方法(0)

复合键的每组行的序列号

我正在尝试维护一个地址历史表:

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
);
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种简单的方法可以自动编号/约束sequence,address_history从而自动从1开始计数person_id.

换句话说,第一行person_id = 1会得到sequence = 1; person_id = 1会得到第二排sequence = 2.第一行person_id = 2,将sequence = 1再次获得.等等.
还有更好/内置的方式来维护这样的历史吗?

sql postgresql database-design auto-increment

7
推荐指数
1
解决办法
1913
查看次数

如何正确地将id生成器序列与表关联

我正在使用Grails 3.0.7和Postgres 9.2.我对Postgres很新,所以这可能是一个愚蠢的问题.如何正确地将id生成器序列与表关联?我在某处读到,如果您创建一个具有serial数据类型的id列的表,那么它将自动为该表创建一个序列.

但是,该列似乎是使用某种类型创建的bigint.如何让Grails创建具有bigserial数据类型的列,这甚至可以解决我的问题?如果我想要每个表一个序列怎么办?我只是不确定如何设置它,因为我过去从未真正使用过Postgres.

postgresql grails database-design

7
推荐指数
1
解决办法
2239
查看次数

如何处理相互递归的插入

我有一个定义相互递归表的模型:

Answer
  questionId QuestionId
  text

Question
  text
  correct AnswerId
Run Code Online (Sandbox Code Playgroud)

实际插入问题需要做什么?我需要先知道正确答案是什么.但要插入答案,我需要知道它回答了什么问题.

如果重要的话,我正在运行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 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql database-design referential-integrity foreign-keys

6
推荐指数
1
解决办法
1062
查看次数

连续递增跳过数字

ID | info
---------
1  | xxx
2  | xxx
4  | xxx
Run Code Online (Sandbox Code Playgroud)

我在 PostgreSQL 中有一个与此类似的设置。(如果有区别的话,我使用的是运行Mojavemac)。

我还有几列,但问题是ID列。这被设置为顺序的,所以使用 Express 我插入到数据库中。

问题是,它会增加ID每个插入甚至失败的插入。info已定义unique,因此尝试插入现有会info返回错误。但是ID还是递增。

例如,如果我插入 2 行,我有id 1& id 2。然后另一个因唯一违规而失败。下一个成功的插入获取id = 4,跳过id = 3

我可以设置 Postgres 使其不会在插入失败时增加吗?

postgresql macos sequence node.js express

6
推荐指数
1
解决办法
3465
查看次数

错误:列“semester_id”是整数类型,但表达式是布尔类型

我在 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 …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql auto-increment database-trigger sql-insert

5
推荐指数
1
解决办法
6284
查看次数

如何将表 ID 从序列号更改为标识号?

我在 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 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql ddl auto-increment

5
推荐指数
1
解决办法
1470
查看次数

GENERATED { ALWAYS | 的限制是什么?默认情况下 } 作为 PostgreSQL 中的 IDENTITY?

PostgreSQL中存在smallserial,serialbigserial数值数据类型,它们分别对 32767、2147483647 和 9223372036854775807 有明显的限制。

但是呢GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY,它有什么限制吗?或者也许它们是根据提供的数据类型(SMALLINT, INT, BIGINT)计算的?

postgresql identity sequence

5
推荐指数
1
解决办法
3093
查看次数

如何以递增的值进行更新

我在 PostgreSQL 中有一个表,它有一个应该是唯一的 ID 列。然而,当前大量行(大约 300 万行)的 ID 为“1”。

我知道的:

  • 总行数
  • ID 列的当前最大值
  • ID(不正确)为“1”的行数

我需要的是一个查询,它将提取 ID 为“1”的所有行,并为它们分配一个自动递增的新 ID,以便表中的每一行都具有唯一的 ID。我希望它从 开始,currentMaxId + 1并为每一行分配后续 ID。

这是我通过查询得到的最接近的结果:

UPDATE table_name
SET id = (
    SELECT max(id) FROM table_name
) + 1
WHERE id = '1'
Run Code Online (Sandbox Code Playgroud)

这样做的问题是,内部 SELECT 仅在第一次运行,因此将相关行的 ID 设置为原始的max(id) + 1,而不是每次都设置为新的max(id) + 1,这给了我想要解决的相同问题。
任何有关如何调整此查询以实现我想要的结果或替代方法的建议将不胜感激!

sql postgresql sql-update

4
推荐指数
1
解决办法
5217
查看次数

在 Postgres 中重命名 nextval('...')

我有一个名为 的表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 ddl column-defaults

4
推荐指数
1
解决办法
5554
查看次数

为每个INSERT增加表ID的值

我正在使用PostgreSQL设置所有表格.我目前有一个名comments为主键的表,comment_id其名称VARCHAR长度为4.

我有一个表单设置插入一个新的注释到数据库但我很困惑,我将如何从我之前的值获取我的Java servlet ++_ comment_id.例如0001到0002.

java postgresql database-design servlets auto-increment

1
推荐指数
2
解决办法
2142
查看次数

Postgres中的DELETE不会减少串行PK?

如果在 SQL Server 中我们有一个自动增量的表,有 10 行,最后一行有id = 10. 当你删除最后一行时,你插入的下一行也会得到id = 10,对吧?

但在 Postgres 中,使用bigserialas PK 时,当我删除具有 max 的行id并插入新行时,它会不断增加 pk 数。

是对的吗?

postgresql key auto-increment

1
推荐指数
1
解决办法
2942
查看次数

串行类型的外键 - 确保始终手动填充

我有两张桌子:国家和地区.

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)
)
Run Code Online (Sandbox Code Playgroud)

当我插入区域时,我希望如果我没有提到countryId,我会被停止,但是,countryId会自动增加.有什么方法可以自动停止进行插入吗?

下面的表格,我设置countryIDSERIAL 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)
)
Run Code Online (Sandbox Code Playgroud)

以下解决了这个问题,但我认为它在技术上是不正确的,因为我的序列可能大于2 ^ 31,但int永远不会> = 2 ^ 31.

CREATE TABLE Legions(
    id           SERIAL,
    countryId    INT NOT …
Run Code Online (Sandbox Code Playgroud)

sql database postgresql database-design

1
推荐指数
1
解决办法
837
查看次数

插入没有ID的命令postgreSQL

在MySQL中,我能够做到

INSERT INTO table_name (column_name1, column_name2) VALUES('John', 'Doe);
Run Code Online (Sandbox Code Playgroud)

如您所见,我不必提及ID,我将如何在postgreSQL中做到这一点。

谢谢

mysql sql postgresql

-1
推荐指数
1
解决办法
2708
查看次数