我遇到了我的主键序列与我的表行不同步的问题.
也就是说,当我插入一个新行时,我得到一个重复的键错误,因为串行数据类型中隐含的序列返回一个已经存在的数字.
这似乎是由导入/恢复不能正确维护序列引起的.
我正在尝试将序列设置为特定值.
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
使用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)
错误:
Run Code Online (Sandbox Code Playgroud)********** Error ********** ERROR: syntax error at or near "AUTO_INCREMENT" SQL state: 42601 Character: 63
知道为什么吗?
我知道使用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 …
我想要一个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
我正在尝试设置临时表以进行单元测试.到目前为止,我设法创建一个复制现有表结构的临时表:
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序列,因此在插入时递增它.有没有简单的方法来复制单元测试表的序列,还是我必须手动设置新的序列?
假设我有一个叫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上,我都对此有任何解决方案:
save提前致谢.
在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.我的要求是从我的数据库中删除未使用的序列.例如,如果我通过我的应用程序创建任何表,将创建一个序列,但是为了删除表,我们也不会删除序列.如果要创建同一个表,则会创建另一个序列.
示例:table : file; 自动创建idcoumn 序列:file_id_seq
当我删除表file并再次使用相同的名称创建它时,正在创建一个新序列(即file_id_seq1).我通过这种方式在应用程序数据库中积累了大量未使用的序列.
如何删除这些未使用的序列?
在 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 ×9
ddl ×3
sql ×3
types ×2
activerecord ×1
create-table ×1
primary-key ×1
rails-models ×1
save ×1
sequence ×1
sequences ×1
temp-tables ×1