【发布时间】:2019-04-19 17:21:11
【问题描述】:
我最近开始使用 Oracle。在此之前,我使用 SQL Server 2008/2012。我注意到 Oracle 和 SQL Server 之间存在一些差异。我在 SQL Server 中创建了包含一些基本列的表,例如名字、姓氏、电子邮件等。这是我的表结构的示例:
Name Data Type Size Not Null
RECORDID NUMBER true //This is primary key (auto increment)
FIRST VARCHAR2 50 true
LAST VARCHAR2 50 true
EMAIL VARCHAR2 320 true
PHONE CHAR 10 true
FILEPATH VARCHAR2 1000 false
TYPE CHAR 1 true
SUBJECT VARCHAR2 100 true
DESCRIPTION VARCHAR 4000 true // This should be varchar(max)
ACTIONDATE DATE true
我在 Oracle SQL Developer 中使用Identity Column 选项将RecordID 设置为列序列。这与 SQL Server 不同,我正在寻找相同的行为。该列应为添加到表中的每个新行自动递增。
这是在 Oracle 中设置身份列的正确方法吗?这是我的插入语句的示例:
<cfquery name="insertRec" datasource="test">
INSERT INTO Table1 (
RecordID, First, Last, Email, Phone,
FilePath, Type, Subject, Description, ActionDate
)VALUES(
RecID_SEQ1.NEXTVAL,
<cfqueryparam cfsqltype="cf_sql_varchar" value="trim(#form.first#)" maxlength="50">,
<cfqueryparam cfsqltype="cf_sql_varchar" value="trim(#form.last#)" maxlength="50">,
<cfqueryparam cfsqltype="cf_sql_varchar" value="trim(#form.email#)" maxlength="50">,
<cfqueryparam cfsqltype="cf_sql_char" value="trim(#form.phone#)" maxlength="10">,
<cfqueryparam cfsqltype="cf_sql_varchar" value="trim(#form.file#)" maxlength="1000">,
<cfqueryparam cfsqltype="cf_sql_char" value="trim(#form.type#)" maxlength="1">,
<cfqueryparam cfsqltype="cf_sql_varchar" value="trim(#form.subject#)" maxlength="100">,
<cfqueryparam cfsqltype="cf_sql_varchar" value="trim(#form.appdescr#)" maxlength="4000">,
CURRENT_TIMESTAMP
)
</cfquery>
在上面的事务中如何设置自增ID?此外,我想返回与 SQL Server 中相同的范围标识。有没有办法在 Oracle 中实现这一目标?如果有人对如何实现这一点或如何改进我上面的代码有任何建议,请告诉我。我刚开始使用 Oracle,这对我来说是新的。
CREATE TABLE "MYDB"."MYTABLE"
( "RECORDID" NUMBER,
"FIRST" VARCHAR2(20 BYTE),
"LAST" VARCHAR2(20 BYTE),
"EMAIL" VARCHAR2(20 BYTE),
"PHONE" CHAR(10 BYTE),
"FILEPATH" VARCHAR2(20 BYTE),
"TYPE" CHAR(1 BYTE),
"SUBJECT" VARCHAR2(20 BYTE),
"DESCRIPTION" VARCHAR2(20 BYTE),
"ACTIONDATE" DATE,
"PRIORITY" CHAR(1 BYTE)
) SEGMENT CREATION DEFERRED
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
TABLESPACE "MYDB" ;
--------------------------------------------------------
-- DDL for Index MYTABLE_PK
--------------------------------------------------------
CREATE UNIQUE INDEX "MYDB"."MYTABLE_PK" ON "MYDB"."MYTABLE" ("RECORDID")
PCTFREE 10 INITRANS 2 MAXTRANS 255 NOCOMPRESS LOGGING
TABLESPACE "MYDB" ;
--------------------------------------------------------
-- DDL for Trigger MYTABLE_TRG
--------------------------------------------------------
CREATE OR REPLACE TRIGGER "MYDB"."MYTABLE_TRG"
BEFORE INSERT ON MYTABLE
FOR EACH ROW
BEGIN
<<COLUMN_SEQUENCES>>
BEGIN
NULL;
END COLUMN_SEQUENCES;
END;
/
ALTER TRIGGER "MYDB"."MYTABLE_TRG" ENABLE;
--------------------------------------------------------
-- DDL for Trigger MYTABLE_TRG1
--------------------------------------------------------
CREATE OR REPLACE TRIGGER "MYDB"."MYTABLE_TRG1"
BEFORE INSERT ON MYTABLE
FOR EACH ROW
BEGIN
<<COLUMN_SEQUENCES>>
BEGIN
IF INSERTING AND :NEW.RECORDID IS NULL THEN
SELECT ADPR_SEQ1.NEXTVAL INTO :NEW.RECORDID FROM SYS.DUAL;
END IF;
END COLUMN_SEQUENCES;
END;
/
ALTER TRIGGER "MYDB"."MYTABLE_TRG1" ENABLE;
【问题讨论】:
-
“我在 Oracle SQL Developer 中使用 Identity Column 选项将 RecordID 设置为 Column Sequence” - 你在数据建模器中吗?我不知道你是否真的有一个 IDENTITY 列或一个带有序列的触发器。请分享您的表格的完整 DDL。
-
@thatjeffsmith 我使用 Oracle SQL Developer 并在那里设置列标识。不确定这是否会回答您的问题。谢谢。
-
如果您使用了标识列,则您的 INSERT 中不需要“RecID_SEQ1.NEXTVAL”...数据库为您提供了该值 - 但我们需要查看您的表 DDL。在sql developer中打开表,进入SQL页面,获取代码,添加到你的问题中,我会给你一个好的答案
-
@thatjeffsmith 我添加了 DDL 请看一下,如果有帮助,请告诉我。
-
好的,您没有标识列...并且您的触发器说如果为 null,则替换为序列中的 nextval,因此您的代码应该只插入所有内容但记录
标签: oracle oracle-sqldeveloper