约束
为了保证数据的一致性,
primary key   (pk)  主键约束       不允许有重复和空值(唯一且非空)
foregin  key   (fk)   外键约束       两张表parent  table      child   table
unique  key   (uk)  唯一可以为空
not   null
数据库设计时的注意:
索引: 为了提高效率而设计的一种与业务无关的
考虑表点用的物理空间:
考虑表之间的关系:
一对多关系: 利用FK+PK实现,多的一方引用外键
一对一关系: 可以利用FK+UK实现,
多对多关系:通过中间增加一个附加表来实现,附加表利用联合主键来实现,联合起来的主键唯一。
DDL语句:数据库定义语句:
table (表)
view(示图)
sequence(序列号)
index(索引)
创建表语句
create    table    [schema].表名   字段名,   字段类型   约束条件);                    schema   默认就是当前用户,严格来访问表名完整的写法是schema.tablename
数据类型:
表名的命令规则: 首字母为字母,不得超过30个字符
char(size)                定长  不管是否达到最大宽度,都会点最大的宽度。
varchar2(size)         可变长   按实际的字节占用空间
number            所有的数字类型都称为number
number(n, m )  n------n位宽度   m-----小数点后的宽度
number(2,4)小数点后4 位,有效位2位    values(0.0099) 这样可以   values(0.01)这样出错
LONG    2GB   大文本一个表最我只允许定义一个LONG类型(不建议使用)
CLOB    大对象形式存放(在表里只存一个指针)
BLOB     存二进制大对象(声音,图像之类)
default   作用演示:
create  table   test(c1   number    default  10,     c2    number);
约束的演示:
主键约束的定义
create table   test(c   number  primary key  );     列级约束
create table  test(c  number , primary key(c) )  ; 表级约束
create table   test( c1  number  constraints   pkc1  primary key );   此约束有名字:  pkc1
create table   test(c number , c2  number ,  primary key (c ,c1) )  ; 用表级约束可以实现联合主键
外键约束的定义:(先定义父表,再定义子表)
carete   table     parent(c1 number  primary key );
create   table    child  (c  number primary key ,   c2 number  references parent(c1));
或表级约束定义:
create   table  child( c number primary key ,  c2  number  , foreign key(c2)  references  parent(c1));
on  delete   cascade  (及联删除,删除父表时子表也跟着删除)
on  delete   set   null  (及联删除父表时子表中引用的字段为null)
day3
不给约束起名字时,系统给约束起名时的规律为:数据库用户名_数字(约束名也不能重名)
定义一个约束的两种形式:
列级约束      表级约束
非空约束
  not    null  (利用desc可能看到)primary key  自动具有非空约束的特点
primary key约束:
主键约束的定义
第一种定义形式:
create table   test(c   number  primary key  );     列级约束
第二种定义形式:
create table  test(c  number , primary key(c) )  ; 表级约束
create table   test( c1  number  constraints   pkc1  primary key );   此约束有名字:  pkc1
create table   test(c number , c2  number ,  primary key (c ,c1) )  ; 用表级约束可以实现联合主键
foregin  key   (fk)   外键约束:
(先定义父表,再定义子表)
create   table     parent(c1 number  primary key );
create   table    child  (c  number primary key ,   c2 number  references parent(c1));
或表级约束定义:
create   table  child( c number primary key ,  c2  number  , foreign key(c2)  references  parent(c1));
check 约束
create   table   test(c1   number  check(c1>1000));
此表中要求c1的值必须要大于1000 才为有效值 .  
怎么创建一个角本文件: xxx.sql结尾
 执行角本的方法:
 在sqlplus环境中执行:@filename.sql
 在shell环境中执行: sqlplus   nanjing/nanjing   @filename.sql
创建表的语法:
 create    table    表名 (   字段名    字段类型     约束类型(可选));
 利用已知表建一张新表:注会把非空约束带过来,其它约束要自己添加
 create  table s_emp_42    as select   from   s_emp     where   dept_id = 42;
只取要表结构,不想要表中数据的建表方式:
create table  s_emp_copy    as   select    from  s_emp   where   1=2;
(这是一个小技巧,在JDBC的学习中会用到 where 1=1 的形式,注意体会)
查看一张表的约束:( 查数据字典示图)
 desc  user_constraints;(这个数据字典中会查到相应的信息)
 select    constraint_name,  constraint_type    from   user_constraints  where   table_name='S_EMP';
   pk
   fk
   check
    UK
    这种只定义在示图中(with check  option 相当于组示图加了一个约束)
    也是出现在示图中
 非空约束和CHECK都是用C来表示
查看字段约束的方法:
 desc    user_cons_columns;
 select   column_name,  position  from    user_cons_columns    where   constraint_name='S_EMP_ID_PK' ;
 position 的含义:联合主键,约束名一样。
 user_constraints    user_cons_columns   两张表的约束名相等,表名相等,两张表一关联就可以查出所需的信息。
select  constraint_name , r_constraint_name  from user_constraints where  constraint_type='R'   and table_name='S_EMP' ;
数据库建立时,数据字典就会建好。
user_constraints; 自己拥有的
all_constraints;   你自己拥有的加上你可以访问的
dba_constraints  所有的
查看当前数据库数据字典的字典(这个示图很重要)
desc   dict;
select table_name form  dict where table_name like   '%cons%;
示图:
user_objects;           user_tables;
select  distinct   object_type  from user_objects;  
介绍事务的概念:
commit  提交,此时说明前面所有语句都成功执行
rollback 回退操作,此时会恢复至上一次提交时的状态。
savepoint 设置保存点
 注意   insert   into  后面可以跟子查询
insert into  s_emp_42   select *   from s_emp  where    dept_id =42;
UPDATE 修改字段值:
update   s_emp  set dept_id =10   where   id =2 ;
update  s_emp  set commission_pct =10  没有where条件时说明是改表中所有的值.
注意:如有外键引用时常会出现外键引用值没有找到等错误?
delete  删除记录命令语法:
delete from   s_emp  where  dept_id=42;
delete form   s_emp ;      没有where条件时说明删除表中所有的值
注意:如有外键引用时,删除一张表时常会出现不能删除的情况,
原因一   是因为此时正在有人操作表中记录
原因二   此表有其他的表引用,没能设及联删除: