我有一个有 workid 列的 workqueue 表。workID 列的值会自动递增。我是否有办法在后台运行查询,插入新行并使 workID 列自动递增?
当我尝试插入空值时,会出现错误 ORA01400 - 无法向 workid 插入空值。
insert into WORKQUEUE (facilitycode,workaction,description) values ('J', 'II', 'TESTVALUES')
我目前所做的尝试 - 我试着查看了表的详细信息,但没有看到任何自动递增。表脚本如下
"WORKID" NUMBER NOT NULL ENABLE,
数据库:Oracle 10g
一些现有数据的截图。 [在此输入图像描述][1]
<hr>;
答案:
我必须感谢每个人的帮助。今天是一次很好的学习经历,没有你们的支持,我不可能完成任务。总之,我试图在一个已经有序列和触发器的表中插入一行。我所要做的就是针对我的问题找到正确的序列,并在查询中调用该序列。
大家提供的链接帮助我查找了这些序列,并找到了适用于 workid 列的序列。多亏了大家,我向大家竖起了大拇指,今天我又能解决另一个难题,帮助病人护理向前迈进了一步!";
您可以使用 SEQUENCE
或 TRIGGER
自动递增数据库表中给定列的值,但使用 TRIGGERS
更为合适。请参阅以下 Oracle 文档,其中包含与触发器一起使用的主要子句以及适当的示例。
使用 CREATE TRIGGER 语句创建并启用数据库触发器:
-与表、模式或 数据库或
匿名 PL/SQL 代码块或调用以 PL/SQL 或 Java 实现的存储过程的调用
当指定条件发生时,Oracle 数据库会自动执行触发器。参见。
下面是一个简单的 TRIGGER
例子,它根据指定表中列的最大值插入主键值。您可以修改模式名称、表名称等并使用它。试试看吧。
/*Create a database trigger that generates automatically primary key values on the CITY table using the max function.*/
CREATE OR REPLACE TRIGGER PROJECT.PK_MAX_TRIGGER_CITY
BEFORE INSERT ON PROJECT.CITY
FOR EACH ROW
DECLARE
CNT NUMBER;
PKV CITY.CITY_ID%TYPE;
NO NUMBER;
BEGIN
SELECT COUNT(*)INTO CNT FROM CITY;
IF CNT=0 THEN
PKV:='CT0001';
ELSE
SELECT 'CT'||LPAD(MAX(TO_NUMBER(SUBSTR(CITY_ID,3,LENGTH(CITY_ID)))+1),4,'0') INTO PKV
FROM CITY;
END IF;
:NEW.CITY_ID:=PKV;
END;
将自动生成诸如 CT0001
、CT0002
、CT0002
等值,并插入指定表的给定列。