我今天写了 PL/SQL 的片段:
declare
first_id number;
second_id number;
begin
insert into table (sort_nr, text_id, unit_id) values(...,
table_seq.nextval, table_seq.nextval) returning text_id, unit_id
into first_id, second_id;
dbms_output.put_line(first_id);
dbms_output.put_line(second_id);
end;
Run Code Online (Sandbox Code Playgroud)
并收到了唯一的常量违规。经过进一步检查,我发现了它,first_id并且second_id在其中具有相同的价值。
我的问题是:在同一个语句中多次调用同一个序列并接收后续号码是否有任何限制?从我的角度来看,似乎nextval只在查询范围内调用一次并缓存。
只是附带说明,我无法更改那个糟糕的架构以避免在两列中使用相同的序列。
我提出关于迪纳利序列的问题,在这里和关于Oracle全球表标识列的仿真另外一个问题在这里。
我一直认为我可以相信身份值会不断增加。另一方面,我知道使用序列我永远无法确定它们中没有一些空白。
是时候适应序列中的差距,还是留在临时表中的标识列会更好?
sql-server sequence identity sql-server-2012 temporary-tables
我们的网站出现间歇性数据库错误,我要求我的网络主机检查发生了什么。经过一番检查,他们发现数据库几乎没有问题,并尝试修复它。最后我收到了他们的以下消息-
我已经尝试了对 InnoDB 数据库的每一次修复,我们仍然得到 InnoDB 日志序列号是未来的。此时,为了让 ibdata 和 iblogfile 再次匹配,我们需要从服务器上的备份中恢复 MySQL 目录(包括数据库)。这个过程应该不会花很长时间,但会有一些与这样的恢复相关的停机时间。如果这不是恢复 MySQL 目录的最佳时间,我可以将其安排在不同的时间。请告诉我您希望如何处理此问题。
有人可以告诉我解决这个问题的最佳方法是什么。我真的不想丢失任何数据并希望修复 dB。
PS:如果您需要更多信息,请告诉我,我会从我们的网络主机上获取。
非常感谢您的帮助。
根据主题,当序列达到其最大值时会发生什么?
行为是什么?我有一个以序列作为主键的大表,想知道。
谢谢。
在创建列管理工具时,我遇到了在 PostgreSQL 中快速复制表的需要,因此我不会使用非测试表来测试新工具。为了有效地测试我最终打算在表上使用的新列工具,parts我创建了这个新工具来复制parts,这样我最终会得到一个parts1表。当我以为我终于解决了所有问题时,当列工具删除表时,我遇到了以下错误:
错误:无法删除表部分,因为其他对象依赖于它详细信息:表 parts1 列 id 的默认值取决于序列 parts_id_seq1
我花了一天的大部分时间来研究这个解决方案,所以简而言之,我可以简单地使用字符串函数来重命名变量以将表与表SEQUENCE_NAME分离,还是这是一个比这更复杂的问题?这是查询:partsparts
DO $$
DECLARE
SEQUENCE_NAME VARCHAR;
BEGIN
SELECT s.relname INTO SEQUENCE_NAME
FROM pg_class AS s JOIN pg_depend d ON d.objid = s.oid
INNER JOIN pg_class AS t ON d.objid = s.oid AND d.refobjid = t.oid
INNER JOIN pg_attribute AS a ON (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum)
INNER JOIN pg_namespace AS n ON n.oid = s.relnamespace
WHERE s.relkind = 'S' …Run Code Online (Sandbox Code Playgroud) 据我所知,此查询应显示串行列的新值的表达式:
select d.adsrc
from (
SELECT a.attrelid, a.attnum, n.nspname, c.relname, a.attname
FROM pg_catalog.pg_attribute a, pg_namespace n, pg_class c
WHERE a.attnum > 0
AND NOT a.attisdropped
AND a.attrelid = c.oid
and c.relkind not in ('S','v')
and c.relnamespace = n.oid
and n.nspname not in ('pg_catalog','pg_toast','information_schema')
) x
left join pg_attrdef d on d.adrelid = x.attrelid and d.adnum = x.attnum
where x.relname = 'table_name' and x.nspname = 'schema_name' and x.attname = 'column_name'
;
Run Code Online (Sandbox Code Playgroud)
它大部分时间都有效,但如果我重命名序列,新名称不会反映在查询结果中 - 它继续显示序列的原始名称。任何想法为什么?
我使用以下命令重命名了一个序列:
ALTER SEQUENCE TableIdSeq RENAME TO NewTableIdSeq;
Run Code Online (Sandbox Code Playgroud)
但是,当我发出\d NewTableIdSeq命令时,我得到以下输出:
Sequence "dev.newtableidseq"
Column | Type | Value
---------------+---------+---------------------
sequence_name | name | tableidseq <--------------- HASN'T CHANGED!!
last_value | bigint | 3
start_value | bigint | 1
increment_by | bigint | 1
max_value | bigint | 9223372036854775807
min_value | bigint | 1
cache_value | bigint | 1
log_cnt | bigint | 30
is_cycled | boolean | f
is_called | boolean | t
Run Code Online (Sandbox Code Playgroud)
如您所见,sequence_name序列的属性仍然设置为旧名称。我如何在这里更改名称?
我的问题看起来很简单,但我还没有找到解决方案。我在插入 SQL 脚本中使用 nexval 序列,但出现错误,因为 LAST_NUMBER 值尚未更新,并且其值与 tabla 数据不正确。例如,对于本例,该值为 5,表有 62 行。
我在谷歌上搜索过,但没有找到命令或更改序列的 LAST_NUMBER 参数的方法。
ALTER SEQUENCE rs2qnes0 START WITH 62;
Run Code Online (Sandbox Code Playgroud)
或ALTER SEQUENCE rs2qnes0 LAST_NUMBER 62;不工作
看起来select nextval('table_name')实际上是增加了价值。
我的目标是nextval在不实际进行任何增量的情况下“预测”数据库中所有表的值。这应该是只读操作。
我无法select nextval在只读连接上运行,因为它实际上是在尝试进行交易。我希望能够查询它并监视只读副本数据库上的序列。
你将如何解决这个问题并实现目标?
我需要复制同一个表中的记录,只更改一个字段。我的表有默认生成的序列entry_id_seq,但是我不确定id列是 SERIAL(如何检查?)。
\d tab 只返回这个
Column | Type | Modifiers
-----------------+--------------------------------+------------------------
id | integer | not null
...
Indexes:
"tab_entry_pkey" PRIMARY KEY, btree (id)
Run Code Online (Sandbox Code Playgroud)
所以问题是:当我尝试以简化的方式复制记录时:
insert into tab_entry select * from tab_entry where id = 3052;
Run Code Online (Sandbox Code Playgroud)
它抛出错误
ERROR: duplicate key value violates unique constraint "tab_entry_pkey"
DETAIL: Key (id)=(3052) already exists.
Run Code Online (Sandbox Code Playgroud)
默认情况下,默认序列不会生成下一个值。是否有任何简洁的语法允许在没有完整表规范的情况下插入和更改单个字段FROM tab(col1, col2, col3, ..., col N)?
该表有很多字段,所以我不想把它们都写出来,因为这会影响代码的可读性。我想要这样的东西,但这种语法不起作用
insert into tab_entry(id, *) select nextval('seq'), * from tab_entry where id = 3052;
Run Code Online (Sandbox Code Playgroud)
SELECT …
sequence ×10
postgresql ×6
oracle ×2
primary-key ×2
dynamic-sql ×1
greenplum ×1
identity ×1
innodb ×1
insert ×1
log ×1
mysql ×1
plsql ×1
recovery ×1
sql-server ×1