Oracle数据库设计——定义约束 Not NULL约束 Default values

本文详细介绍了Oracle数据库中的Not Null约束和默认值设置。解释了Not Null约束在冲突时为何不包含约束名,以及如何创建带有默认值的字段。同时,讨论了在维护约束时的DISABLE和ENABLE操作,包括NOVALIDATE选项的影响和风险。文章还提到了在处理主键和Unique约束时,与索引和外键的关系。
部署运行你感兴趣的模型镜像

Not Null约束
not null约束常常被归于“强制”约束。

CREATE TABLE temp(id NUMBER(1) NOT NULL);

CREATE TABLE temp(id NUMBER(1) CONSTRAINT nn_temp_id NOT NULL);

为什么我们为Primary key, unique, foreign key, 和chech约束命名,有一个重要原因是:
    Oracle约束冲突错误信息包含了约束名,这是一个非常有用的的信息,让我们可以在没有查看数据字典和引起错误的研究代码前迅速的定位分离出问题.
而not null冲突错误信息中没有约束名,因为它包含了字段名
CREATE TABLE temp
 (N1 NUMBER constraint nn_1 NOT NULL,
  N2 NUMBER constraint nn_2 NOT NULL,
  N3 NUMBER constraint nn_3 NOT NULL);

INSERT INTO temp VALUES (1, null, 1);
将会产生:
ORA-01400: cannot insert NULL into ("SCOTT"."TEMP"."N2")

Default Values(默认值)

看一下下面一个例子:
CREATE TABLE TEMP (id NUMBER, value NUMBER);
INSERT INTO temp             VALUES (1, 100);
INSERT INTO temp (id, value) VALUES (1, 100);
INSERT INTO temp (id)        VALUES (2);

前两行Insert语句是一样的,第三条在Value字段中插入了一个NULL值
你希望这样吗?一个NULL?也许一个0会更好一点,下面我们用0来代替默认的Null值
CREATE TABLE TEMP (id NUMBER,
                   value VARCHAR2(10) DEFAULT 0);
Value字段的默认插入值不再是Null,
INSERT INTO temp (id) VALUES (2);将会是(2,0);

NULL和0的意义是不一样的,Null是一个对象,比如说学生表中有一个学位字段,如果某学生没有学位,那么这个字段可以默认设置为Null.
0是一个数据值,表示数据量为0,比如所某员工每月奖金,默认可以设置为0;当然也可以默认为空,但在显示计算的时候需要对Null对象字段进行处理,否则就会出现异常。

约束维护

(1)、ALTER TABLE table_name DISABLE CONSTRAINT constraint_name;
    保留约束的数据字典定义,但不应用约束。在数据库开发中当你需要加载数据时不希望应用商业规则到这些数据上你可以这样做。一旦数据加载后你可以通过SQL*PLUS来浏览它。如果数据没问题,可以enable约束。
(2)、ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;
    如果数据有错,Enable操作将会失败。Oracle错误信息将会显示约束不能应用,因为数据不能满足约束规则。有三种选择当数据不正确,不能Enable约束时;
    1、删除插入的数据
    2、使用异常处理表方式Enable约束,(后面将会讲述)
    3、使用NOVALIDATE选项Enable约束.语法如下:
        ALTER TABLE table_name ENABLE CONSTRAINT constraint_name NOVALIDATE;
    NOVALIDATE选项Enable约束但未来事务处理中就会存在问题。表中的当前数据不满足约束,这会产生一些严重的后果。比如,许多应用的组件依赖于商业规则。html界面的一个文本框可能是查询中使用主键查询Where语句中一部分,这是编程中返回单行记录常见情形,如果返回多行记录,代码将崩溃。
    如果任务类型是学习和分析历史数据的,NOVALIDATE选项将不会有问题,你可以保留旧的,不合约束规则的数据在表中,Enable约束,处理加载一些新数据,并在这些新数据上应用商业规则。但NOVALIDATE在生产系统中将带来许多问题。
    当Disable一个主键或Unique约束时,主键或Unique字段上的索引被删除。因此,如果表比较大,你可能会在enable时看到一些时间延迟。这是来重建索引的时间。同样,如果删除约束,索引也删除。
    Disable或Drop主键或Unique(被一个外键参照)操作时可以是CASCADE选项.语法是:
     ALTER TABLE table_name DISABLE CONSTRAINT constraint_name CASCADE;
     ALTER TABLE table_name DROP CONSTRAINT constraint_name CASCADE;
    如果你不知道有一个外键而没有使用CASCADE选项,AlTER TABLE 操作就会失败。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

Oracle 数据库中,如果某个字段定义了默认值(例如 `DEFAULT 'value'`),在插入数据时,如果希望跳过该字段并使用 `NULL` 值插入,而不是使用默认值,可以采用以下几种方式实现: ### 使用 `NULL` 显式插入 在 `INSERT` 语句中显式地将字段设置为 `NULL`,这样即使字段定义了默认值,也会被 `NULL` 替代。例如: ```sql INSERT INTO employees (employee_id, first_name, last_name, commission_pct) VALUES (101, 'John', 'Doe', NULL); ``` 如果 `commission_pct` 字段定义了默认值(例如 `DEFAULT 0.1`),上述语句仍然会插入 `NULL` 而不是默认值 `0.1` [^1]。 ### 省略字段并插入 `NULL` 如果字段允许 `NULL` 值(即字段未定义为 `NOT NULL`),并且定义了默认值,可以通过省略该字段并在 `VALUES` 子句中使用 `NULL` 来实现跳过默认值。例如: ```sql INSERT INTO employees (employee_id, first_name, last_name) VALUES (102, 'Jane', 'Smith', NULL); ``` 在这种情况下,`commission_pct` 字段被省略,但通过 `VALUES` 中的 `NULL`,仍然可以跳过默认值并插入 `NULL`。 ### 使用 `DEFAULT` 和 `NULL` 混合插入 如果需要部分字段使用默认值,部分字段使用 `NULL`,可以结合 `DEFAULT` 和 `NULL` 进行插入。例如: ```sql INSERT INTO employees (employee_id, first_name, last_name, commission_pct) VALUES (103, 'Alice', 'Johnson', DEFAULT); ``` 此语句会将 `commission_pct` 插入默认值,而其他字段则按照提供的值插入。如果希望某些字段使用默认值,而某些字段插入 `NULL`,则可以在 `VALUES` 子句中混合使用 `DEFAULT` 和 `NULL`。 ### 注意事项 - **字段允许 `NULL`**:确保目标字段允许 `NULL` 值插入,否则会抛出错误。 - **默认值与 `NULL` 的优先级**:在 `INSERT` 语句中,显式插入的 `NULL` 会覆盖默认值。如果字段定义为 `NOT NULL` 并且具有默认值,则不能插入 `NULL`,只能使用默认值或显式提供有效值。 ### 示例代码 假设 `employees` 表的结构如下: ```sql CREATE TABLE employees ( employee_id NUMBER PRIMARY KEY, first_name VARCHAR2(50), last_name VARCHAR2(50), commission_pct NUMBER DEFAULT 0.1 ); ``` 插入数据时跳过默认值并使用 `NULL` 的完整示例如下: ```sql -- 显式插入 NULL INSERT INTO employees (employee_id, first_name, last_name, commission_pct) VALUES (104, 'Bob', 'Brown', NULL); -- 省略字段并插入 NULL INSERT INTO employees (employee_id, first_name, last_name) VALUES (105, 'Charlie', 'Davis', NULL); -- 混合使用 DEFAULTNULL INSERT INTO employees (employee_id, first_name, last_name, commission_pct) VALUES (106, 'Eve', 'White', DEFAULT); ``` 执行上述语句后,`commission_pct` 字段的值将根据插入语句中的设置,要么是 `NULL`,要么是默认值 `0.1`。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值