I tested these examples in an Oracle 11.2 database. The first one shows how to add a NOT NULL constraint retrospectively. You start by creating a table:
SQL> create table andrew (col1 varchar2(1))
2 /
Table created.
SQL>
Then at some point in the future, you add a NOT NULL constraint like this:
SQL> alter table andrew modify (col1 not null)
2 /
Table altered.
SQL>
Doing it this way, the constraint is obvious when you describe the table:
SQL> desc andrew
Name Null? Type
-------------------------- -------- ------------------
COL1 NOT NULL VARCHAR2(1)
SQL>
… and, if you try to add a null value, the error message is self-explanatory:
SQL> insert into andrew values (null)
2 /
insert into andrew values (null)
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("ORACLE"."ANDREW"."COL1")
SQL>
The second example, which I saw recently, shows how NOT to do it. You start, as before, by creating a table:
SQL> create table fred (col1 varchar2(1))
2 /
Table created.
SQL>
… then you add a CHECK constraint as follows:
SQL> alter table fred
2 add constraint con1
3 check (col1 is not null)
4 /
Table altered.
SQL>
You cannot see this constraint when you describe the table:
SQL> desc fred
Name Null? Type
-------------------------- -------- ------------------
COL1 VARCHAR2(1)
SQL>
… and when you try to add a null value, the error message is not very helpful:
SQL> insert into fred values (null)
2 /
insert into fred values (null)
*
ERROR at line 1:
ORA-02290: check constraint (ORACLE.CON1) violated
SQL>
No comments:
Post a Comment