我有一张“收据”表。我有列customer_id(谁有收据)和receipt_number。对于每个客户,receipt_number 应该从 1 开始,并且是一个序列。这意味着customer_id 和receipt_number 将是唯一的。我怎样才能优雅地做到这一点。我可以将内置序列功能与 CREATE SEQUENCE 或类似功能一起使用吗?似乎我必须为每个客户创建一个序列,这当然不是一个优雅的解决方案。
编辑:必须有一种线程安全和白痴安全的方式来做到这一点。这应该是一个非常简单/常见的需求。
我使用 SimpleJdbcInsert 作为,
SimpleJdbcInsert simpleJdbcInsert = new SimpleJdbcInsert(dataSource).withTableName(TABLE_NAME).withSchemaName(SCHEMA_NAME);
Map<String, Object> namedParameterMap = new HashMap<String, Object>();
namedParameterMap.put("ID", "MYSEQ.NEXTVAL");
namedParameterMap.put("COLUMN1NAME",obj1.getColumn1Value());
namedParameterMap.put("COLUMN2NAME", obj1.getColumn2Value());
simpleJdbcInsert.withoutTableColumnMetaDataAccess().execute(namedParameters);
Run Code Online (Sandbox Code Playgroud)
但它仅对 ID 列引发错误,其他列工作正常,我通过注释掉 ID 列来确认这一点。
java.lang.NumberFormatException: null
Run Code Online (Sandbox Code Playgroud)
我检查了我的 Oracle 序列,它工作正常。我检查了很多博客,但找不到使用 Oracle 序列和 SimpleJdbcInsert 的合适博客。
oracle spring-jdbc jdbctemplate simplejdbcinsert database-sequence
我们在Db2数据库中使用序列.最近,我们已将数据从AIX服务器迁移到Linux服务器.在此期间,该序列的最新数量未移至Linux系统.因此,我们现在看到重复值.
以下是我们如何使用序列:
SELECT NEXTVAL FOR SEQ_YFS_ORDER_NO FROM SYSIBM.SYSDUMMY1
Run Code Online (Sandbox Code Playgroud)
Linux上序列的当前值是100092142.如何将它更新为AIX系统上的当前值,即(100110960)?
我有两个表:
CREATE TABLE tbl_a (
id serial primary key NOT NULL,
name text NOT NULL,
tbl_b_reference NOT NULL
)
CREATE TABLE tbl_b (
id serial primary key NOT NULL,
status text)
Run Code Online (Sandbox Code Playgroud)
我想做两个插入。一个在 tbl_b 中,然后在我插入 tbl_a 时使用该插入中的 ID。
我试过这个:
INSERT INTO tbl_a(name, tbl_b_reference)
VALUES ("myName", (INSERT INTO tbl_b (status) VALUES ('OK') RETURNING id));
Run Code Online (Sandbox Code Playgroud)
但我只收到指向第二个“INTO”的语法错误
ERROR: syntax error at or near "INTO" Position: 68
Run Code Online (Sandbox Code Playgroud)
我从哪里开始,是否可以在不编写永久函数或创建触发器的情况下做到这一点?我是 postgres 的新手,只知道 MySQL/MariaDB 的一些基础知识。我一直在这里搜索与嵌套插入相关的其他问题,但找不到我设法实际使用的东西,因此非常感谢代码示例。
我正在为Patient表的现有列设置标识列。
在这里,我想使用GENERATED ALWAYS AS IDENTITY。
因此,我使用以下语句设置了标识列(以前是serial):
ALTER TABLE Patient ALTER PatientId
ADD GENERATED ALWAYS AS IDENTITY (START WITH 1);
Run Code Online (Sandbox Code Playgroud)
对于现有的患者表,我总共有 5 条记录。( patientId1 到 5)
当我在身份设置后插入新记录时,它会抛出如下错误:
more than one owned sequence found
Run Code Online (Sandbox Code Playgroud)
即使在重置标识列后,我仍然遇到相同的错误。
ALTER TABLE Patient ALTER COLUMN PatientId RESTART WITH 6;
Run Code Online (Sandbox Code Playgroud)
如果您有任何解决方案,请告诉我。
我删除了表中的 2000 行,然后插入了相同的 2000 条记录,但它们的索引(id 自动增量字段)从 2001 年开始,现在我想将这些索引 2001 - 4000 更新为 1-2000
例如,这是一个年度序列。的no增量为year:
| no | year |
+----+------+
| 1 | 2016 |
| 2 | 2016 |
| 3 | 2016 |
| 1 | 2017 |
| 2 | 2017 |
| 4 | 2016 |
Run Code Online (Sandbox Code Playgroud)
目前,我已经为每年创建了序列,
但是问题是Oracle不会在明年自动创建新序列。
另一个问题是,如果我想使用3D序列,year并在和内递增type:
| no | year | type |
+----+------+------+
| 1 | 2016 | a |
| 2 | 2016 | a |
| 1 | 2016 | b |
| 1 | …Run Code Online (Sandbox Code Playgroud) 我阅读了关于在PostgreSQL中授予序列的答案.一般来说,他们说同时授予SELECT,USAGE.我想知道我是否只能授予使用权.哪一个是授予序列的最佳实践,为什么?
我使用 TablePlus(SQL 客户端)将 Postgres SQL 文件导入到我的服务器,但在插入新行后,出现如下错误:
SQLSTATE[23505]:唯一违规:7 错误:重复键值违反唯一约束 \"users_pkey\" 详细信息:键 (id)=(1) 已经存在
我知道它是由序列值为 0 引起的,需要通过以下代码更新:
SELECT setval(_sequence_name_, max(id)) FROM _table_name_;
Run Code Online (Sandbox Code Playgroud)
但是如果我必须一一写入所有表序列(可能是数百个序列),则需要很多时间。那么如何一次更新所有序列呢?
我知道这个问题有点愚蠢,我需要运行这些查询来查看值是否不同步,但我收到类似“关系不存在”的错误:
SELECT MAX(the_primary_key) FROM the_table;
SELECT nextval('the_primary_key_sequence');
Run Code Online (Sandbox Code Playgroud)
我有一个名为“Audit”的表,其主键列为“auditID”。当我运行第一个查询时,我得到了结果:
SELECT MAX('auditID') FROM "Audit";
max
---------
auditID
(1 row)
Run Code Online (Sandbox Code Playgroud)
但最大应该超过 10000。
然后我运行第二个查询,并收到错误“关系“the_primary_key_sequence”或“Audit_auditID_seq”不存在”。如何检查主键序列是否存在?
错误:
select setval('Audit_auditID_seq', 171832, true);
ERROR: relation "audit_auditid_seq" does not exist
LINE 1: select setval('Audit_auditID_seq', 171832, true);
Run Code Online (Sandbox Code Playgroud) 我有一个疑问
CREATE SEQUENCE "SEQ_ID"
MINVALUE 1
MAXVALUE 99999
INCREMENT BY 1 START WITH 121
CACHE 20
NOORDER
NOCYCLE;
Run Code Online (Sandbox Code Playgroud)
这是一个oracle命令。
现在,我想转换成 PostgreSQL 命令。
我如何在这里替换“NO ORDER”。
postgresql ×8
sql ×4
oracle ×2
db2 ×1
jdbctemplate ×1
oracle12c ×1
sequences ×1
spring-jdbc ×1
sql-insert ×1