Как установить значение по умолчанию при вставке нуля - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь установить значение по умолчанию для своей таблицы клиентов в 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 из моей таблицы без какого-либо значения вставки выводятся как «-» вместо значения по умолчанию «NOT STATED»,но когда я запускаю свою программу, ошибок не обнаружено.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Если вы действительно хотите, чтобы столбец по умолчанию имел ненулевое значение, даже если для оператора 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.

Примечание: это «НЕ УКАЗАНО» известно как «магическая ценность» и обычно считается плохой практикой.Было бы лучше, если вы хотите отображать «НЕ УКАЗАНО» на экране, если не было введено никакого значения, использовать выражение SQL, такое как NVL(CUST_STATE,'NOT STATED') во время запроса.

0 голосов
/ 26 ноября 2018

Это то, что вы в настоящее время делаете (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 операторы.Вообще говоря, вы должны всегда назвать все столбцы, которые вы используете.Правда, для этого требуется больше печатать, но - делая это - вы можете контролировать процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...