如何创建视图中的一个NOT NULL列(How to create a not null colum

2019-06-25 13:54发布

鉴于类似的表:

CREATE TABLE "MyTable" 
(
  "MyColumn" NUMBER NOT NULL
);

我想创建像一个观点:

CREATE VIEW "MyView" AS
SELECT
    CAST("MyColumn" AS BINARY_DOUBLE) AS "MyColumn"
FROM "MyTable";

只有在列“MyColumn”是“NOT NULL”。

在SQL Server中,这是相当直截了当:

CREATE VIEW [MyView] AS
SELECT
    ISNULL(CAST([MyColumn] AS Float), 0.0) AS [MyColumn]
FROM [MyTable];

然而,在“NULL”列甲骨文相同的结果:

CREATE VIEW "MyView" AS
SELECT
    NVL(CAST("MyColumn" AS BINARY_DOUBLE), 0.0) AS "MyColumn"
FROM "MyTable";

反正是有强制甲骨文视图的列标记为元数据中的“NOT NULL”?

Answer 1:

您不能添加非空或检查约束的视图; 看到这与在同一页上和“关于检查约束限制”上NOT NULL约束限制“。 您可以添加一个with check option (对冗余的where子句)的观点,但不会被标记为not null数据字典。

我能想到的唯一办法让这种影响是,如果你是在11g中,以投增值作为餐桌上的虚拟列,并且(如果它仍然需要),创建针对该视图:

ALTER TABLE "MyTable" ADD "MyBDColumn" AS
    (CAST("MyColumn" AS BINARY_DOUBLE)) NOT NULL;

CREATE OR REPLACE VIEW "MyView" AS
SELECT
    "MyBDColumn" AS "MyColumn"
FROM "MyTable";

desc "MyView"

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 MyColumn                                  NOT NULL BINARY_DOUBLE

既然你在dba.se评论,这是对嘲讽的东西了说,你可以使用正常的列和触发模拟虚拟列:

CREATE TABLE "MyTable" 
(
  "MyColumn" NUMBER NOT NULL,
  "MyBDColumn" BINARY_DOUBLE NOT NULL
);

CREATE TRIGGER "MyTrigger" before update or insert on "MyTable"
FOR EACH ROW
BEGIN
    :new."MyBDColumn" := :new."MyColumn";
END;
/

CREATE VIEW "MyView" AS
SELECT
    "MyBDColumn" AS "MyColumn"
FROM "MyTable";

INSERT INTO "MyTable" ("MyColumn") values (2);

SELECT * FROM "MyView";

  MyColumn
----------
  2.0E+000

desc "MyView"仍然给:

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 MyColumn                                  NOT NULL BINARY_DOUBLE

由于利提到的(也dba.se),如果你确实想插入/更新,你可以使用一个视图instead of触发,与VC或仿版。



Answer 2:

如果你有一个视图列NOT NULL约束我相信,从视图中选择将随后失败如果有问题的柱NULL。 如果是这样的意图那么下面可能给你,你找什么:

CREATE OR REPLACE VIEW some_view AS
  SELECT some_field,
         some_other_field,
         CASE
           WHEN field_of_interest IS NOT NULL
             THEN CAST(field_of_interest AS BINARY_DOUBLE)
             ELSE 1 / 0
         END AS field_of_interest_not_null
     FROM some_table;

不是非常有吸引力,你会得到一个丑陋的“ORA-01476:师等于零”如果案件的ELSE分支转移的消息,但也许这是道路上的一个步骤,以“更好”。

分享和享受。


编辑:如果目标是只能拿起行,其中你的目标列不为空,也许你可以在WHERE子句添加到您的看法,如:

CREATE OR REPLACE VIEW some_view AS
  SELECT some_field,
         some_other_field,
         CAST(field_of_interest AS BINARY_DOUBLE) AS field_of_interest
    FROM some_table
    WHERE field_of_interest IS NOT NULL;

因人而异。


EDIT2:纵观SQL Server的例子,似乎正在使用ISNULL功能,保证列永远不能为null。 如果这是可以接受的,你可以做到以下几点:

CREATE OR REPLACE VIEW some_view AS
  SELECT some_field,
         some_other_field,
         CAST(NVL(field_of_interest, 0.0) AS BINARY_DOUBLE) AS field_of_interest
    FROM some_table
    WHERE field_of_interest IS NOT NULL;

引述布温克尔,“这一次肯定FER !!!” :-)



文章来源: How to create a not null column in a view