我正在尝试在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',但是当我运行我的程序时没有检测到错误。
如果您确实希望该列默认为非空值,即使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表达式会更好。
这是你目前正在做的事情(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
语句。一般来说,您应该始终为您正在使用的所有列命名。没错,它需要更多的打字,但是 - 这样做 - 你可以控制这个过程。