我想强制一个表的自动增量字段为某个值,我尝试了这个:
ALTER TABLE product AUTO_INCREMENT = 1453
AND
ALTER SEQUENCE product RESTART WITH 1453;
ERROR: relation "your_sequence_name" does not exist
我是postgres的新手:(
我有product
和Id
字段
name
答案 0 :(得分:217)
如果您使用product
列创建了表格id
,则该序列不仅仅称为product
,而是product_id_seq
(即${table}_${column}_seq
})。
这是您需要的ALTER SEQUENCE
命令:
ALTER SEQUENCE product_id_seq RESTART WITH 1453
您可以使用psql中的\ds
命令查看数据库中的序列。如果您执行\d product
并查看列的默认约束,nextval(...)
调用也会指定序列名称。
答案 1 :(得分:139)
这是您要查找的命令,假设产品表的序列是product_id_seq:
ALTER SEQUENCE product_id_seq RESTART WITH 1453;
答案 2 :(得分:109)
以下命令会自动为您执行此操作:这也将删除表中的所有数据。所以要小心。
TRUNCATE TABLE someTable RESTART IDENTITY;
答案 3 :(得分:52)
设置序列计数器:
setval('product_id_seq', 1453);
如果您不知道序列名称,请使用pg_get_serial_sequence
函数:
select pg_get_serial_sequence('product', 'id');
pg_get_serial_sequence
------------------------
public.product_id_seq
参数是表名和列名。
或者只是在\d product
提示符处发出psql
:
=> \d product
Table "public.product"
Column | Type | Modifiers
--------+---------+------------------------------------------------------
id | integer | not null default nextval('product_id_seq'::regclass)
name | text |
答案 4 :(得分:12)
为方便访问者而从评论转换
从这条消息中不清楚正确的语法是什么。它是:
ALTER SEQUENCE product_id_seq RESTART WITH 1453;
答案 5 :(得分:4)
如果您想从GUI重新重置自动增量,请按照以下步骤操作。
答案 6 :(得分:2)
要重置自动增量,您必须使用以下查询来获取序列名称。
语法:
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;
答案 7 :(得分:2)
如果您有一个带有IDENTITY列的表,要为其重置下一个值,则可以使用以下命令:
ALTER TABLE ALTER COLUMN重新启动;
答案 8 :(得分:2)
-更改序列的起始值
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
答案 9 :(得分:1)
使用此查询来检查什么是具有架构和表的序列键。
SELECT pg_get_serial_sequence('"SchemaName"."TableName"', 'KeyColumnName'); // output: "SequenceKey"
使用此查询一个一个地增加增量值,
SELECT nextval('"SchemaName"."SequenceKey"'::regclass); // output 110
当插入表时,下一个增加的值将用作键(111)。
使用此查询将特定值设置为增量值
SELECT setval('"SchemaName"."SequenceKey"', 120);
当插入表格时,下一个增加的值将用作键(121)。
答案 10 :(得分:0)
要获取序列ID,请使用
SELECT pg_get_serial_sequence('tableName', 'ColumnName');
这将为您提供ID为 tableName_ColumnName_seq
的ID使用上一个种子号获取
select currval(pg_get_serial_sequence('tableName', 'ColumnName'));
或者如果您知道序列ID已经直接使用它。
select currval(tableName_ColumnName_seq);
它将为您提供最后的种子编号
要重置种子编号,请使用
ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45
答案 11 :(得分:0)
请注意,如果您的表名带有'_',则会以序列名将其删除。
例如,表名称:user_tokens列:id 序列名称:usertokens_id_seq
答案 12 :(得分:0)
节点脚本:修复所有表的身份:自动递增/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();
答案 13 :(得分:0)
要将其设置为您可以使用的下一个最高值:
SELECT SETVAL(pg_get_serial_sequence('table_name', 'column_name'), (SELECT MAX(column_name) FROM table_name));
答案 14 :(得分:0)
2021 年,Postgres 11.12
ALTER SEQUENCE 对我不起作用,它以某种方式将其重置为 null。 对我有用的是:
SELECT setval('<table>_<column>_seq', 5);