广州鸿名健康科技有限公司


Oracle主键值默认被设置为0(oracle主键默认为0)

网络编程 Oracle主键值默认被设置为0(oracle主键默认为0) 10-18

Oracle主键值默认被设置为0

在Oracle数据库中,主键是一个非常重要的概念,它是用来保证数据表中数据的唯一性和一致性。Oracle在创建主键时,默认情况下会将主键值设置为0。这个默认设置在实际应用中可能会带来一些问题,需要我们在设计数据库时进行注意。

为什么会默认设置主键值为0呢?这是因为Oracle使用了一种叫做“伪列”的技术。伪列是Oracle数据库自动生成的一组特殊列,它们不需要我们手动添加和维护。其中一个伪列就是ROWID,它是表中每一行的唯一标识符。在Oracle建立主键时,如果不指定主键值,那么Oracle会使用ROWID作为主键,默认值为0。

看起来这个默认设置很方便,然而在实际开发中会出现一个问题,那就是如果我们在插入一条新记录时没有指定主键值,Oracle会自动使用ROWID作为主键,但是这个值是不可预测的,因此当我们需要对数据进行更新和删除时,就无法正确地定位到对应的记录。

例如,我们在以下示例中创建了一个名为“EMPLOYEES”的员工表,并为其添加了一个主键列“EMPLOYEE_ID”:

CREATE TABLE EMPLOYEES(
EMPLOYEE_ID NUMBER(5) PRIMARY KEY,
FIRST_NAME VARCHAR2(20),
LAST_NAME VARCHAR2(25),
EML VARCHAR2(25),
HIRE_DATE DATE DEFAULT SYSDATE,
JOB_ID VARCHAR2(10),
SALARY NUMBER(8,2),
COMMISSION_PCT NUMBER(2,2),
MANAGER_ID NUMBER(5),
DEPARTMENT_ID NUMBER(3)
);

假设我们向表中插入一条新记录,但是忘记了指定“EMPLOYEE_ID”主键值:

INSERT INTO EMPLOYEES(FIRST_NAME, LAST_NAME, EML, JOB_ID, SALARY)
VALUES('John', 'Smith', 'john.smith@eml.com', 'IT_PROG', 5000);

此时Oracle会自动使用ROWID作为主键,主键值为0。如果我们想要更新或删除这条记录,必须使用ROWID进行定位:

UPDATE EMPLOYEES SET SALARY = 6000 WHERE ROWID = 'AAAEy+AAEAAAAJxAAB';
DELETE FROM EMPLOYEES WHERE ROWID = 'AAAEy+AAEAAAAJxAAB';

这里的ROWID是通过查询语句获取到的,无法预测和维护。如果在实际开发中,我们需要频繁地对数据进行更新和删除操作,那么使用ROWID作为主键就会严重影响效率和可维护性。

所以,我们应该避免使用Oracle默认设置的主键值为0,而是在创建表的时候明确指定主键值。例如:

CREATE TABLE EMPLOYEES(
EMPLOYEE_ID NUMBER(5) PRIMARY KEY,
FIRST_NAME VARCHAR2(20),
LAST_NAME VARCHAR2(25),
EML VARCHAR2(25),
HIRE_DATE DATE DEFAULT SYSDATE,
JOB_ID VARCHAR2(10),
SALARY NUMBER(8,2),
COMMISSION_PCT NUMBER(2,2),
MANAGER_ID NUMBER(5),
DEPARTMENT_ID NUMBER(3)
);

INSERT INTO EMPLOYEES(EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EML, JOB_ID, SALARY)
VALUES(1, 'John', 'Smith', 'john.smith@eml.com', 'IT_PROG', 5000);

这样,我们就可以更加方便地对数据进行更新和删除操作,提高效率和可维护性。

总结起来,Oracle主键值默认被设置为0可能会在实际开发中带来一些问题,我们需要在设计数据库时注意,并明确指定主键值。这样可以提高效率和可维护性,保证数据表中数据的唯一性和一致性。


编辑:广州鸿名健康科技有限公司

标签:主键,可维护性,值为,默认设置,数据