所以我有下表:
CREATE TABLE Projects (
ID INTEGER CONSTRAINT ProjPK PRIMARY KEY,
Column1 VARCHAR2(30) NOT NULL ,
Column2 VARCHAR2(10) NOT NULL ,
Column3 INTEGER NULL ,
Column4 VARCHAR2(20) NULL ,
Column5 INTEGER NOT NULL ,
Column6 INTEGER NULL ,
Column7 DATE NULL
);
我需要為 Column7 提出一個 CHECK-Constraint,如果第 4 列和第 6 列不為空,則只允許將 Column7 更改為不同的值。
我想表達的是,如果第 4 列或第 6 列為 NULL,則 column7 必須為 NULL,如果第 4 列和第 6 列為 NOT NULL,則只能分別為 NOT NULL。我希望這是有道理的。任何幫助,將不勝感激。
uj5u.com熱心網友回復:
我會說,這是觸發器的任務。
簡化表:
SQL> CREATE TABLE projects
2 (
3 id INTEGER CONSTRAINT projpk PRIMARY KEY,
4 column1 VARCHAR2 (30),
5 column2 VARCHAR2 (10),
6 column3 INTEGER,
7 column4 VARCHAR2 (20),
8 column5 INTEGER,
9 column6 INTEGER,
10 column7 DATE
11 );
Table created.
扳機:
SQL> CREATE OR REPLACE TRIGGER trg_ch7
2 BEFORE UPDATE
3 ON projects
4 FOR EACH ROW
5 BEGIN
6 IF :old.column7 <> :new.column7
7 THEN
8 IF :new.column4 IS NULL
9 AND :new.column6 IS NULL
10 THEN
11 NULL;
12 ELSE
13 raise_application_error (
14 -20000,
15 'Col 7 can not be changed because cols 4 and 6 are not empty');
16 END IF;
17 END IF;
18 END;
19 /
Trigger created.
SQL>
測驗:
SQL> INSERT INTO projects (id, column1, column7)
2 VALUES (1, 'test', SYSDATE);
1 row created.
SQL>
SQL> UPDATE projects
2 SET column7 = SYSDATE 1
3 WHERE id = 1;
1 row updated.
SQL>
SQL> UPDATE projects
2 SET column4 = 'not empty'
3 WHERE id = 1;
1 row updated.
SQL>
SQL> UPDATE projects
2 SET column7 = SYSDATE 2
3 WHERE id = 1;
UPDATE projects
*
ERROR at line 1:
ORA-20000: Col 7 can not be changed because cols
4 and 6 are not empty
ORA-06512: at "SCOTT.TRG_CH7", line 9
ORA-04088: error during execution of trigger
'SCOTT.TRG_CH7'
SQL>
uj5u.com熱心網友回復:
使用一個簡單的檢查約束來定義你的限制
alter table projects add CONSTRAINT check_null
CHECK ( (column4 is null and column6 is null and column7 is null) or
(column4 is not null and column6 is not null and column7 is not null) );
一些測驗
失敗,因為第 7 列已定義,第 4,6 列未定義
INSERT INTO projects (id, column1, column7) VALUES (1, 'fail', SYSDATE);
--ORA-02290: check constraint (xxx.CHECK_NULL) violated
OK,因為所有的列都是 NULL
INSERT INTO projects (id, column1, column7) VALUES (1, 'OK', null);
-- 1 row inserted.
.. 或全部定義。
INSERT INTO projects (id, column1,column4, column6, column7) VALUES (2, 'OK','x',1, SYSDATE);
-- 1 row inserted.
請注意,如果簡單的 CHECK 約束就足夠了,請不要使用觸發器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/385721.html
