首页 > 解决方案 > 插入null时如何设置默认值

问题描述

我正在尝试为我在 Oracle 中的客户表设置默认值。

这是我的编码

CREATE TABLE CUSTOMER
(
CUST_ID     VARCHAR(10),
CUST_NAME   VARCHAR(20)   NOT NULL UNIQUE,
CUST_DOB    DATE          NULL,               
CUST_STATE  VARCHAR(20)   DEFAULT 'NOT STATED',
PRIMARY KEY(CUST_ID)
);

这是我的插入...

INSERT INTO CUSTOMER VALUES ('C001','Murphy','1/30/1989','Melaka');
INSERT INTO CUSTOMER VALUES ('C002','Cooper','4/20/1993','Selangor');
INSERT INTO CUSTOMER VALUES ('C003','Richard','','Perak');
INSERT INTO CUSTOMER VALUES ('C004','Howard','6/24/1997','Johor');
INSERT INTO CUSTOMER VALUES ('C005','Torres','8/3/1983','Negeri Sembilan');
INSERT INTO CUSTOMER VALUES ('C006','Peterson','12/31/1990','Kedah');
INSERT INTO CUSTOMER VALUES ('C007','Gray','5/20/1999','');
INSERT INTO CUSTOMER VALUES ('C008','James','','');
INSERT INTO CUSTOMER VALUES ('C009','Watson','10/9/1993','Sabah');
INSERT INTO CUSTOMER VALUES ('C010','Brooks','9/17/1989','Terengganu');
INSERT INTO CUSTOMER VALUES ('C011','Kelly','8/23/1997','Perlis');
INSERT INTO CUSTOMER VALUES ('C012','Wendy','','');
INSERT INTO CUSTOMER VALUES ('C013','Perry','7/18/1993','Selangor');
INSERT INTO CUSTOMER VALUES ('C014','Alexander','2/13/1980','Kelantan');
INSERT INTO CUSTOMER VALUES ('C015','Gladys','','Sarawak');

当我运行程序并使用

select * from CUSTOMER

我的表中没有任何插入值的所有CUST_STATE内容都出现“ - ”而不是默认值“未说明”,但是当我运行我的程序时没有检测到错误。

标签: sqldatabaseoracle

解决方案


如果您确实希望该列默认为非空值,即使 INSERT 语句为其设置了 NULL,您也可以使用 DEFAULT ON NULL 语法,例如:

ALTER TABLE CUSTOMER MODIFY CUST_STATE DEFAULT ON NULL 'NOT STATED';

或者,如果您从头开始创建表:

CREATE TABLE CUSTOMER
(
CUST_ID     VARCHAR(10),
CUST_NAME   VARCHAR(20)   NOT NULL UNIQUE,
CUST_DOB    DATE          NULL,               
CUST_STATE  VARCHAR(20)   DEFAULT ON NULL 'NOT STATED',
PRIMARY KEY(CUST_ID)
);

现在,当您为该列插入 NULL 行时:

INSERT INTO CUSTOMER VALUES ('C007','Gray','5/20/1999','');

该行将具有'NOT STATED'for CUST_STATE

注意:这个“NOT STATED”被称为“magic value”,通常被认为是不好的做法。如果您想在未输入任何值的情况下在屏幕上显示“NOT STATED”,那么最好NVL(CUST_STATE,'NOT STATED')在查询时使用 SQL 表达式。


推荐阅读