从Database中的其他列创建列

时间:2014-07-07 08:25:57

标签: sql derby

我有一个表名: test
ID |前缀| ACCID
ID 的类型是INTEGER,它是从 ID_SEQ 中选择的 前缀的类型为VARCHAR(6)
ACCID 是Prefix + ID

的组合

我想在插入ID和前缀值(例如

)时自动创建ACCID
INSERT INTO TEST (PREFIX) VALUES ('A01407V');

并且数据库将ACCID存储为' A01407V000001'

我将序列创建为

CREATE SEQUENCE ID_SEQ AS INT MAXVALUE 999999 CYCLE;

如何实现SQL语句来产生这个结果?
感谢您提供所有解决方案和建议。

聚苯乙烯。我使用 Apache Derby 作为我的SQL Server

2 个答案:

答案 0 :(得分:2)

作为documented in the manual,Derby支持生成的列(自10.5版本起)

真正的问题是带有前导零的数字格式,因为Derby没有这个功能。

如果你真的认为你需要存储一个总是由已经存储在表中的值确定的值,你可以使用这样的东西:

create table test
(
  id integer,
  prefix varchar(6),
  accid  generated always as (prefix||substr('000000', 1, 6 - length(rtrim(char(id))))||rtrim(char(id)))
);

表达式substr('000000', 1, 6 - length(rtrim(char(id))))||rtrim(char(id))只是使用前导零格式化ID的复杂方法。

我强烈建议不要存储此值。如果您确实需要在SQL中访问它,那么创建一个显示此值的视图会更加清晰。

答案 1 :(得分:1)

您可以使用COMPUTED Column。

是基于表中其他列的计算列。我们可以物理地保存列的数据/不。表将自动更新此列的值。

syntax:
    columnname AS expression [PERSISTED]  

--PERSISTED will make it physically saved, otherwise it will be calculated every time.

我们可以在计算列上创建索引。

您可以在表格CREATE Script

中添加以下内容
ACCID AS Prefix + CAST(ID AS CHAR(6)) [PERSISTED]