>我有一个包含 10 列的表,我的 INSERT
语句仅引用表中的特定列。
INSERT INTO SCHEMA.TABLE
(COL_1, COL_2)
VALUES
(VAL_1, VAL_2);
。或。。。
INSERT INTO SCHEMA.TABLE
(COL_1, COL_2)
SELECT VAL_1, VAL_2 FROM SCHEMA_2.TABLE_2;
但是,当我执行它时,其他列总是以 null 值插入,而不是根据列类型(即数字)具有相应的列。也就是说,如果我有一个数字列,我应该看到一个零。
我怎样才能正确地插入?
请考虑我没有 DDL 权限,我正在尝试插入到现有表中。
最简单的方法可能是为您的列提供默认值:
ALTER TABLE schema.table MODIFY (COL_1 NUMBER DEFAULT 0);
DEFAULT
值;但是,请注意,您必须注意所做的事情,因为列可能无法获得其默认值。下面是一个示例:
SQL> create table test
2 (id number primary key,
3 name varchar2(10),
4 address varchar2(20) default 'Unknown', --> columns with default
5 num_val number default 0 --> values
6 );
Table created.
如果您在插入值时没有指定应该获取默认值的列,则一切都将如您所愿:
SQL> insert into test (id, name) values (1, 'Little');
1 row created.
SQL> select * from test;
ID NAME ADDRESS NUM_VAL
---------- ---------- -------------------- ----------
1 Little Unknown 0
看?ADDRESS
和 NUM_VAL
都有默认值。
但是,如果您在语句INSERT
中提到这些列,尽管将它们设置为 NULL
,但它们不会设置为默认值,而是NULL
:
SQL> insert into test (id, name, address, num_val)
2 values (2, 'Foot', null, null);
1 row created.
SQL> select * from test;
ID NAME ADDRESS NUM_VAL
---------- ---------- -------------------- ----------
1 Little Unknown 0
2 Foot
如您所见,包含ID = 2
的行在ADDRESS
和NUM_VAL
列中没有获得默认值。
因此,请注意您的所作所为。
使用该列DEFAULT
作为0
或
use NVL( column_name, 0 ) --as per oracle syntax
--this would mean whenever theres null found for
-- that column set it to 0 (will work on insert)
或
Update column set column=0 where column IS NULL
--(will work after insert as the name suggests update)
虽然坦率地说我不建议这样做,但您可以使用触发器来实现您的目标:
CREATE OR REPLACE TRIGGER SCHEMA.TABLE_BI
BEFORE INSERT ON SCHEMA.TABLE
FOR EACH ROW
BEGIN
:NEW.COL_1 := COALESCE(:NEW.COL_1, 0); -- NUMBER column
:NEW.COL_2 := COALESCE(:NEW.COL_2, ' '); -- VARCHAR column
:NEW.COL_3 := COALESCE(:NEW.COL_3, SYSDATE); -- DATE column
END SCHEMA.TABLE_BI;
但是,创建触发器可能需要您没有的权限。
要回答这个问题:这需要在创建表时定义,确定默认值。在这种情况下,我无法做到这一点,因为表定义指示 NULL,即使在数字的情况下也是如此。
无论如何,谢谢。