我想将表的自动增量字段强制为某个值,我尝试了这个:
ALTER TABLE product AUTO_INCREMENT = 1453
和
ALTER SEQUENCE product RESTART WITH 1453;
ERROR: relation "your_sequence_name" does not exist
我是 postgres 的新手 :(
我有一个带有 Id
和 name
字段的表 product
如果您使用 id
列创建了表 product
,则该序列不会简单地称为 product
,而是称为 product_id_seq
(即 ${table}_${column}_seq
)。
这是您需要的 ALTER SEQUENCE
命令:
ALTER SEQUENCE product_id_seq RESTART WITH 1453
您可以使用 psql 中的 \ds
命令查看数据库中的序列。如果您执行 \d product
并查看列的默认约束,则 nextval(...)
调用也将指定序列名称。
以下命令会自动为您执行此操作:这还将删除表中的所有数据。所以要小心。
TRUNCATE TABLE someTable RESTART IDENTITY;
TABLE
关键字是多余的。 TRUNCATE someTable RESTART IDENTITY;
就足够了。
TRUNCATE someTable RESTART IDENTITY CASCADE;
吗?
TRUNCATE table2, table1 RESTART IDENTITY;
这是您要查找的命令,假设您的产品表序列是 product_id_seq:
ALTER SEQUENCE product_id_seq RESTART WITH 1453;
设置序列计数器:
setval('product_id_seq', 1453);
如果您不知道序列名称,请使用 pg_get_serial_sequence
函数:
select pg_get_serial_sequence('product', 'id');
pg_get_serial_sequence
------------------------
public.product_id_seq
参数是表名和列名。
或者只是在 psql
提示符处发出 \d product
:
=> \d product
Table "public.product"
Column | Type | Modifiers
--------+---------+------------------------------------------------------
id | integer | not null default nextval('product_id_seq'::regclass)
name | text |
-- Change the starting value of the sequence
ALTER SEQUENCE project_id_seq RESTART 3000;
相同但动态:
SELECT SETVAL('project_id_seq', (SELECT MAX(id) + 1 FROM project));
我同意使用 SELECT
令人不安,但它确实有效。
来源:https://kylewbanks.com/blog/Adding-or-Modifying-a-PostgreSQL-Sequence-Auto-Increment
brew services restart postgresql
为了访问者的方便,从评论转换
从这条消息中不清楚正确的语法是什么。这是:
ALTER SEQUENCE product_id_seq RESTART WITH 1453;
如果您有一个包含 IDENTITY 列的表,您想要重置下一个值,可以使用以下命令:
ALTER TABLE <table name>
ALTER COLUMN <column name>
RESTART WITH <new value to restart with>;
sequence
或您不能截断表格的情况下,一个 + 表示可用性。我认为这是最好的答案
要将其设置为下一个最高值,您可以使用:
SELECT SETVAL(pg_get_serial_sequence('table_name', 'column_name'), (SELECT MAX(column_name) FROM table_name));
2021 年,Postgres 11.12
ALTER SEQUENCE 对我不起作用,它以某种方式将其重置为 null。对我有用的是:
SELECT setval('<table>_<column>_seq', 5);
如果要从 GUI 重置自动增量,请按照以下步骤操作。
转到您的数据库单击表列表页面中的公共,您可以看到诸如“表”、“视图”、“序列”之类的 TABS。单击“序列”时单击序列,您可以看到所有序列列表,单击要重置的任何内容之后,您可以看到多个选择,例如“更改”、“设置值”、“重新启动”、“重置”等等...然后单击重置,然后添加一个新行。
要重置自动增量,您必须使用以下查询获取序列名称。
句法:
SELECT pg_get_serial_sequence(‘tablename’, ‘ columnname‘);
例子:
SELECT pg_get_serial_sequence('demo', 'autoid');
查询将返回autoid的序列名称为“Demo_autoid_seq” 然后使用以下查询重置autoid
句法:
ALTER SEQUENCE sequenceName RESTART WITH value;
例子:
ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;
要获取序列 ID,请使用
SELECT pg_get_serial_sequence('tableName', 'ColumnName');
这将为您提供 sequesce id 作为 tableName_ColumnName_seq
要获取最后一个种子编号,请使用
select currval(pg_get_serial_sequence('tableName', 'ColumnName'));
或者如果您知道序列 id 已经直接使用它。
select currval(tableName_ColumnName_seq);
它会给你最后的种子编号
要重置种子编号,请使用
ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45
使用此查询检查带有模式和表的序列键是什么,
SELECT pg_get_serial_sequence('"SchemaName"."TableName"', 'KeyColumnName'); // output: "SequenceKey"
使用这个查询一个一个地增加增量值,
SELECT nextval('"SchemaName"."SequenceKey"'::regclass); // output 110
插入表时,下一个递增值将用作键 (111)。
使用此查询将特定值设置为增量值
SELECT setval('"SchemaName"."SequenceKey"', 120);
插入表时,下一个递增值将用作键 (121)。
如果表像
bigint NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 0)
在 0-9
范围内插入一些记录后,会导致下一个 insert
发生冲突,因此要重置 START:
ALTER TABLE ... ALTER COLUMN ... RESTART WITH 10;
请注意,如果您的表名带有“_”,它将在序列名称中删除。
例如表名:user_tokens 列:id 序列名:usertokens_id_seq
节点脚本:修复所有表身份:自动增量/nextval,基于上次插入它。
const pg = require('pg');
const { Client } = pg;
const updateTables = async () => {
const client = new Client({
user: 'postgres',
host: 'localhost',
database: 'my-database',
password: 'postgres',
port: 5432,
});
await client.connect();
console.log('Connected');
const execQuery = async (queryStr, params = []) => {
return new Promise((resolve, reject) => {
client.query(queryStr, params, (error, results) => {
if (error) {
reject(error);
} else {
resolve(results);
}
})
})
}
const tablesRes = await execQuery(`
SELECT table_name
FROM information_schema.tables
WHERE table_type='BASE TABLE'
AND table_schema='public';
`)
const tables = tablesRes.rows.map(row => row.table_name);
tables.map(async tableName => {
let lastId;
try {
const res = await execQuery(`SELECT id from "${tableName}" ORDER BY id DESC LIMIT 1`);
lastId = res.rows[0].id;
} catch (e) {}
if (lastId) {
const nextId = lastId + 1;
const queryStr = `ALTER SEQUENCE ${tableName}_id_seq RESTART WITH ${nextId}`;
await execQuery(queryStr);
console.log(tableName, queryStr);
}
})
};
updateTables();
我不确定以上所有答案,如果我没有序列名称怎么办?如果我不想截断我的表格怎么办?
下面的查询帮助我在不影响现有数据的情况下做到这一点。
ALTER TABLE <<table_name>>
ALTER COLUMN <<primary_key_column_name>> RESTART SET START 4044;
不定期副业成功案例分享
ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #
,其中“seq”是文字文本,您输入一个数字作为 #。不要忽略下划线。 :-)ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453
1453
的记录,则应为RESTART WITH 1454
。IDENTITY
列约束,您可以执行ALTER TABLE tbl ALTER COLUMN id RESTART SET START 1453