相关疑难解决方法(0)

如何在postgres不同步时重置postgres的主键序列?

我遇到了我的主键序列与我的表行不同步的问题.

也就是说,当我插入一个新行时,我得到一个重复的键错误,因为串行数据类型中隐含的序列返回一个已经存在的数字.

这似乎是由导入/恢复不能正确维护序列引起的.

postgresql primary-key database-sequence

482
推荐指数
17
解决办法
23万
查看次数

Postgres手动改变序列

我正在尝试将序列设置为特定值.

SELECT setval('payments_id_seq'), 21, true
Run Code Online (Sandbox Code Playgroud)

这给出了一个错误:

ERROR: function setval(unknown) does not exist

使用ALTER SEQUENCE似乎也不起作用?

ALTER SEQUENCE payments_id_seq LASTVALUE 22
Run Code Online (Sandbox Code Playgroud)

如何才能做到这一点?

参考:https://www.postgresql.org/docs/current/static/functions-sequence.html

postgresql database-sequence

149
推荐指数
5
解决办法
14万
查看次数

自动增量表列

使用Postgres,我试图AUTO_INCREMENT在SQL中自动编号我的主键.但是,它给了我一个错误.

CREATE TABLE Staff   (
  ID        INTEGER NOT NULL AUTO_INCREMENT,
  Name      VARCHAR(40) NOT NULL,
  PRIMARY KEY (ID)
);
Run Code Online (Sandbox Code Playgroud)

错误:

********** Error **********
ERROR: syntax error at or near "AUTO_INCREMENT"
SQL state: 42601
Character: 63
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

sql postgresql types auto-increment database-table

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

安全,干净地重命名在Postgres中使用串行主键列的表?

我知道使用SERIAL主键的PostgreSQL表最终会有一个由PostgreSQL创建的隐式索引,序列和约束.问题是在重命名表时如何重命名这些隐式对象.下面是我尝试在最后通过具体问题解决这个问题.

给出一个像这样的表

CREATE TABLE foo (
    pkey SERIAL PRIMARY KEY,
    value INTEGER
);
Run Code Online (Sandbox Code Playgroud)

Postgres输出

CREATE TABLE foo (
  pkey serial NOT NULL,
  value integer,
  CONSTRAINT foo_pkey PRIMARY KEY (pkey )
);
ALTER TABLE foo OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)

PgAdmin III显示以下作为表的DDL

ALTER table foo RENAME TO bar;
Run Code Online (Sandbox Code Playgroud)

现在重命名表

CREATE TABLE bar (
  pkey integer NOT NULL DEFAULT nextval('foo_pkey_seq'::regclass),
  value integer,
  CONSTRAINT foo_pkey PRIMARY KEY (pkey )
);
ALTER TABLE bar OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)

Postgres输出

ALTER SEQUENCE foo_pkey_seq RENAME TO bar_pkey_seq;
Run Code Online (Sandbox Code Playgroud)

表格的PgAdmin III …

sql postgresql ddl database-design

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

如何将序列添加到迁移并在模型中使用它们?

我想要一个Customer带有普通主键的模型和另一个用于存储自定义"客户编号"的列.另外,我希望db能够处理默认的客户编号.我认为,定义序列是最好的方法.我使用PostgreSQL.看看我的迁移:

class CreateAccountsCustomers < ActiveRecord::Migration
  def up

    say "Creating sequenze for customer number starting at 1002"
    execute 'CREATE SEQUENCE customer_no_seq START 1002;'

    create_table :accounts_customers do |t|
      t.string :type
      t.integer :customer_no, :unique => true
      t.integer :salutation, :limit => 1
      t.string :cp_name_1
      t.string :cp_name_2
      t.string :cp_name_3
      t.string :cp_name_4
      t.string :name_first, :limit => 55
      t.string :name_last, :limit => 55
      t.timestamps
    end

    say "Adding NEXTVAL('customer_no_seq') to column cust_id"
    execute "ALTER TABLE accounts_customers ALTER COLUMN customer_no SET DEFAULT NEXTVAL('customer_no_seq');"

  end

  def down
    drop_table …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-models rails-migrations rails-postgresql ruby-on-rails-3.1

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

如何复制PostgreSQL表的结构和内容,但重复序列?

我正在尝试设置临时表以进行单元测试.到目前为止,我设法创建一个复制现有表结构的临时表:

CREATE TEMP TABLE t_mytable (LIKE mytable INCLUDING DEFAULTS);
Run Code Online (Sandbox Code Playgroud)

但这缺乏原始表中的数据.我可以使用CREATE TABLE AS语句将数据复制到临时表中:

CREATE TEMP TABLE t_mytable AS SELECT * FROM mytable;
Run Code Online (Sandbox Code Playgroud)

但是结构t_mytable将不相同,例如列大小和默认值不同.是否有一个复制一切的声明?

我在使用第一个查询时遇到的另一个问题LIKE是,关键字段引用原始表的ID序列,因此在插入时递增它.有没有简单的方法来复制单元测试表的序列,还是我必须手动设置新的序列?

sql postgresql temp-tables create-table

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

Ruby on Rails + PostgreSQL:自定义序列的使用

假设我有一个叫Transaction有:transaction_code属性的模型.我希望该属性自动填充可能不同的序列号id(例如,id=1可能有的事务transaction_code=1000).

我试图在postgres上创建一个序列,然后为该序列的transaction_code列创建默认值nextval.问题是,如果我没有@transaction.transaction_code在RoR上分配任何值,当我@transaction.save在RoR上发出一个时,它会尝试执行以下SQL:

INSERT INTO transactions (transaction_code) VALUES (NULL);

这样做是在Transactions表上创建一个新行,其中transaction_code为NULL,而不是计算序列的nextval并将其插入相应的列.因此,正如我所知,如果你为postgres指定NULL,它假定你真的想要在该列中插入NULL,无论它是否具有默认值(我来自ORACLE,它具有不同的行为).

无论是在数据库上还是在RoR上,我都对此有任何解决方案:

  • 要么有办法从ActiveRecord中排除属性 save
  • 或者有一种方法可以在插入触发器之前更改列的值
  • 或者有一种方法可以在RoR中生成这些序列号
  • 或任何其他方式,只要它的工作原理:-)

提前致谢.

postgresql activerecord ruby-on-rails save rails-postgresql

8
推荐指数
2
解决办法
3099
查看次数

如何将主键从整数转换为串行?

在Postgres 9.3表中,我有一个integer主键,自动序列递增,但我达到了最大值integer.如何将其转换integer为serial?
我试过了:

ALTER TABLE my_table ALTER COLUMN id SET DATA TYPE bigint;
Run Code Online (Sandbox Code Playgroud)

但是相同的数据类型不适serial用于bigint.好像我无法转换为serial?

postgresql ddl types auto-increment postgresql-9.3

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

如何删除未使用的序列?

我们正在使用PostgreSQL.我的要求是从我的数据库中删除未使用的序列.例如,如果我通过我的应用程序创建任何表,将创建一个序列,但是为了删除表,我们也不会删除序列.如果要创建同一个表,则会创建另一个序列.

示例:table : file; 自动创建idcoumn 序列:file_id_seq

当我删除表file并再次使用相同的名称创建它时,正在创建一个新序列(即file_id_seq1).我通过这种方式在应用程序数据库中积累了大量未使用的序列.

如何删除这些未使用的序列?

postgresql ddl sequences

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

如何有效地检查 PostgreSQL 中已使用和未使用值的序列

在 PostgreSQL (9.3) 中,我有一个表定义为:

CREATE TABLE charts
( recid serial NOT NULL,
  groupid text NOT NULL,
  chart_number integer NOT NULL,
  "timestamp" timestamp without time zone NOT NULL DEFAULT now(),
  modified timestamp without time zone NOT NULL DEFAULT now(),
  donotsee boolean,
  CONSTRAINT pk_charts PRIMARY KEY (recid),
  CONSTRAINT chart_groupid UNIQUE (groupid),
  CONSTRAINT charts_ichart_key UNIQUE (chart_number)
);

CREATE TRIGGER update_modified
  BEFORE UPDATE ON charts
  FOR EACH ROW EXECUTE PROCEDURE update_modified();
Run Code Online (Sandbox Code Playgroud)

我想用如下序列替换chart_number:

CREATE SEQUENCE charts_chartnumber_seq START 16047;
Run Code Online (Sandbox Code Playgroud)

以便通过触发器或函数,添加新图表记录自动按升序生成新图表编号。但是,没有现有的海图记录可以更改海图编号,而且多年来分配的海图编号一直存在跳跃现象。因此,在为新图表记录分配新图表编号之前,我需要确保尚未使用“新”图表编号,并且没有为具有图表编号的任何图表记录分配不同的编号。

如何才能做到这一点?

postgresql sequence gaps-and-islands

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