插入null时如何设置默认值

问题描述 投票:2回答:2

我正在尝试在Oracle中为customer表设置默认值。

这是我的编码

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都出现了“ - ”而不是默认值'NOT STATED',但是当我运行我的程序时没有检测到错误。

sql database oracle
2个回答
1
投票

如果您确实希望该列默认为非空值,即使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'CUST_STATE

注意:这个“未声明”被称为“神奇的价值”,通常被认为是不好的做法。如果你想在没有输入值的情况下在屏幕上显示“NOT STATED”,那么在查询时使用NVL(CUST_STATE,'NOT STATED')等SQL表达式会更好。


0
投票

这是你目前正在做的事情(C007没有CUST_STATE):

SQL> insert into customer (cust_id, cust_name, cust_dob, cust_state)
  2    values ('C007','Gray','5/20/1999', '');

1 row created.

SQL> select * from customer where cust_id = 'C007';

CUST_ID    CUST_NAME            CUST_DOB   CUST_STATE
---------- -------------------- ---------- --------------------
C007       Gray                 05/20/1999

SQL>

正如你所看到的,CUST_STATE是空的,而你期望'没有说明'。

INSERT有什么问题?几乎没有;这是预期的行为。仅当您未指定要插入该列的值时,Oracle才会使用列的默认值。另一方面,您表示要将空字符串('')放入该列,因此从未使用过默认值。

但是,如果你完全省略CUST_STATE列的值,它将按你所希望的那样工作:

SQL> delete from customer where cust_id = 'C007';

1 row deleted.

SQL> insert into customer (cust_id, cust_name, cust_dob)
  2    values ('C007','Gray','5/20/1999');

1 row created.

SQL> select * from customer where cust_id = 'C007';

CUST_ID    CUST_NAME            CUST_DOB   CUST_STATE
---------- -------------------- ---------- --------------------
C007       Gray                 05/20/1999 NOT STATED

SQL>

所以,重写那些INSERT INTO语句。一般来说,您应该始终为您正在使用的所有列命名。没错,它需要更多的打字,但是 - 这样做 - 你可以控制这个过程。

© www.soinside.com 2019 - 2024. All rights reserved.