sql >> Database teknologi >  >> RDS >> Oracle

Sådan opretter du en ikke-nul kolonne i en visning

Du kan ikke tilføje en ikke-nul- eller check-begrænsning til en visning; se dette og på samme side 'Restrictions on NOT NULL Constraints' og 'Restrictions on Check Constraints'. Du kan tilføje en with check option (mod en redundant where-klausul) til visningen, men den vil ikke blive markeret som not null i dataordbogen.

Den eneste måde, jeg kan tænke på at få denne effekt på, er, hvis du er på 11g, at tilføje cast-værdien som en virtuel kolonne på bordet, og (hvis det stadig er nødvendigt) oprette visningen mod det:

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

Da du sagde i en kommentar på dba.se, at dette er for at håne noget, kan du bruge en normal kolonne og en trigger til at simulere den virtuelle kolonne:

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

Og desc "MyView" giver stadig:

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

Som Leigh nævnte (også på dba.se), hvis du ville indsætte/opdatere visningen, kunne du bruge en instead of trigger, med VC eller falsk version.



  1. Hvordan vælger man en specifik kolonne fra rumdatabase givet en specifik parameter i værelsesforespørgsel?

  2. Kan du bruge et alias i WHERE-sætningen i mysql?

  3. Sådan viser du sorteringen af ​​en kolonne i MySQL

  4. MySQL - Hvordan SUMMER man tider?