在INSERT中,如何使null值为零或null?

时间:2018-12-27 18:27:47

标签: sql oracle null sql-insert

我有一个包含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;

但是,当我执行它时,其他列总是以空值插入,而不是根据列类型(即数字)而具有相应的值。这是,如果我有一个数字列,我应该看到一个零。

如何正确插入?

***请考虑我没有DDL特权,并且我正在尝试插入现有表中。

5 个答案:

答案 0 :(得分:2)

最简单的方法可能是为您的列提供默认值:

ALTER TABLE schema.table MODIFY (COL_1 NUMBER DEFAULT 0);

答案 1 :(得分:1)

对该列使用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)

答案 2 :(得分:1)

DEFAULT的值是;但是,请注意,您必须注意所做的事情,因为column可能无法获得其默认值。这是一个示例:

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

看到了吗? ADDRESSNUM_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 = 2ADDRESS列中,带有NUM_VAL的行未获得默认值。

因此,请注意您的工作。

答案 3 :(得分:1)

虽然坦率地说我不建议这样做,但是您可以使用触发器来实现您的目标:

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;

但是,创建触发器可能需要您没有的特权。

答案 4 :(得分:0)

要回答这个问题:需要在创建表时定义默认值。在这种情况下,我无法执行此操作,因为即使在数字的情况下,表定义仍指示为NULL。

还是谢谢。