Sem*_*ZEN 5 postgresql primary-key sequence auto-increment
我在 postgres 中有一个表,其主键是使用序列分配的(我们称之为“a_seq”)。该序列用于递增值并将当前值作为正在插入的记录的主键插入。
我用于序列的代码:
CREATE SEQUENCE public.a_seq
INCREMENT 1
START 1
MINVALUE 1
MAXVALUE 9223372036854775807
CACHE 1;
ALTER SEQUENCE public.AssembleTable_RowId_seq OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)
我正在尝试从磁盘复制文件并将有关复制文件的信息插入到表中。磁盘中存在同名文件,因此我使用以下查询从序列中检索“last_value”:
SELECT last_value FROM a_seq;
Run Code Online (Sandbox Code Playgroud)
并重命名文件“_”,然后将其插入数据库,以便文件名和该文件的主键(id)一致,如下所示:
id | fileName
1 | 1_asd.txt
Run Code Online (Sandbox Code Playgroud)
但是当我插入记录时,id 始终比从查询中获取的“last_value”大 1 个值,因此表如下所示:
id | fileName
2 | 1_asd.txt
Run Code Online (Sandbox Code Playgroud)
我尝试多次执行上面的选择查询来检查它是否增加了值,但事实并非如此。
知道如何在插入之前获取分配给记录的值吗?
注意:我使用 MATLAB,这是用于插入的代码:
colnames = {'DataType' , ...
'FilePath' , ...
'FileName' , ...
'FileVersion' , ...
'CRC32Q' , ...
'InsertionDateTime', ...
'DataSource' };
data = {FileLine{5} ,... % DataType
tempPath ,... % FilePath
FileLine{1} ,... % FileName
FileLine{2} ,... % FileVersion
FileLine{3} ,... % CRC32Q
FileLine{4} ,... % InsertionDateTime
FileLine{6} ,... % DataSource};
data_table = cell2table(data, 'VariableNames', colnames);
datainsert(conn , 'CopiedFiles' , colnames , data_table);
Run Code Online (Sandbox Code Playgroud)
更新
我相信你会发生的是:当你select last_value
- 你得到最后使用的序列值并且当你insert
行时,默认值id
是nextval
,它将值滚动到上面 1...
前一篇
我相信你nextval
在中间步骤中有一个额外的地方。如果您在一条语句中执行此操作,它将按您的预期工作,例如:
t=# create table so12(s int default nextval('s'), t text);
CREATE TABLE
t=# insert into so12(t) select last_value||'_abc.txt' from s;
INSERT 0 1
t=# select * from so12;
s | t
---+-----------
1 | 1_abc.txt
(1 row)
Run Code Online (Sandbox Code Playgroud)
update2
正如尼克·巴恩斯(Nick Barnes)注意到的那样,进一步(然后是初始1)迭代将给出错误的结果,su你需要使用heis提出的CASE
逻辑
归档时间: |
|
查看次数: |
13370 次 |
最近记录: |