Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да създадете колона, която не е нула в изглед

Не можете да добавите ограничение non null или check към изглед; вижте това и на същата страница „Ограничения за ограничения НЕ 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 или фалшива версия.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на дата в ограничение за проверка, Oracle

  2. CHARTOROWID() Функция в Oracle

  3. AWS Python Lambda с Oracle

  4. Oracle Managed ODP.NET не може да намери tnsnames.ora

  5. Oracle:Java съхранена процедура, изпращаща JMS съобщение