Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle-如何使用varchar类型生成自动增量列?_Sql_Oracle_Auto Increment - Fatal编程技术网

Sql Oracle-如何使用varchar类型生成自动增量列?

Sql Oracle-如何使用varchar类型生成自动增量列?,sql,oracle,auto-increment,Sql,Oracle,Auto Increment,在我与Oracle 11g的任务中,我被要求制作一个具有以下结构的列的表: [NL|TE|][0-9]^10 其中,插入行时输入NL或TE,[0-9]^10是自动递增的10位数。 例如: 插入时,用户只应写入以下内容: INSERT INTO TableA VALUES ('NL'); 数据库管理系统负责其余的工作。那我该怎么做呢?我还是这方面的新手。示例代码 'NL' || to_char(yoursequence.nextval) 我会将它们作为单独的列保存。一个是VA

在我与Oracle 11g的任务中,我被要求制作一个具有以下结构的列的表:

    [NL|TE|][0-9]^10
其中,插入行时输入NL或TE,[0-9]^10是自动递增的10位数。 例如:

插入时,用户只应写入以下内容:

    INSERT INTO TableA VALUES ('NL');
数据库管理系统负责其余的工作。那我该怎么做呢?我还是这方面的新手。

示例代码

'NL' || to_char(yoursequence.nextval)

我会将它们作为单独的列保存。一个是VARCHAR2,它接受
NL
或其他任何内容,另一个是由序列填充的数字

然后,您可以在查询时连接它们(如果需要,可以将其放在视图中)或使用虚拟列


为什么??我几乎可以向您保证,在某个时刻,您需要查询表中的字符部分或数字部分,或者根据其中一个进行排序。因为你把它们分开了,所以这很容易。如果将它们压缩成一列,则必须在查询时解析出值,这会导致代码比需要的更复杂。

查看表触发器您可以始终使用序列。@paqogomez和Bracuz只查看了触发器和序列,看起来像我需要的,但如何将两者结合起来?因为数据既有字符也有数字。有人能给我看一个示例SQL代码吗?所有这些都是很好的答案,但是@Gary_W’s结合了触发器和序列,可以完全按照您的需要回答问题。如果您以足够高的值开始序列,则不必连接0。此代码可以做到这一点。但是你能解释一下结尾的“你的桌子名”吗?我没有在触发器语法中看到它。@Tr1et抱歉,我不清楚。这只是触发器的名称;表的名称,其中“BI”表示“before insert”(您也可以有其他触发器)。哦,那也是一个打字错误,应该是“BI”。我更正了。虽然我同意,但问题的措辞表明这不是一个选项。这可能是一个学术练习。OP的问题并没有提出这两个问题。他“被要求”建造一些有效的东西。此解决方案将完全按照需要工作-我以前使用过此技术。@JeffreyKemp谢谢,我会记住此技术,但Bracuk猜测正确,这是一项学术作业,我甚至无法更改列数据类型。
CREATE SEQUENCE your_seq;
/

CREATE OR REPLACE TRIGGER your_tablename_BI
BEFORE INSERT
ON your_tablename
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
 :NEW.your_col := :NEW.your_col || trim(to_char(your_seq.nextval, '0000000000'));

END your_tablename_BI;
/
CREATE SEQUENCE your_seq;
/

CREATE OR REPLACE TRIGGER your_tablename_BI
BEFORE INSERT
ON your_tablename
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
 :NEW.your_col := :NEW.your_col || trim(to_char(your_seq.nextval, '0000000000'));

END your_tablename_BI;
/