10.oracleDDL语句

                       --------DDL语句---------
DDL 语句-数据定义语言:用来定义数据据库对象的操作语句
特点:ddl 语句不需要提交,执行完立即生效
DDL 语句分类:
CREATE-创建 --项目初期常用
DROP-删除 --项目中后期删除表基本没用
alter-修改 --建表后添加数据前改变表结构
TRUNCATE-清空 --比较常用仅限表格,清空所有数据保留表结构
rename- 重命名 --不建议使用

DDL 和 DML 两者增删改区别?
DML 针对数据源的数据进行操作
DDL 针对数据库中各种对象的操作
数据库对象:表,试图,序列,索引,约束,同义词,存储过程,存储函数
=======================================================================
--建表语句:
create TABLE TB_NAME
(COL_NAME1,COT_TYPE,
COL_NAME2,COL_TYPE,
。。。。
)
--特殊语法:
CREATE TABLE TB_ANME AS SELECT ....
--给表添加注释
COMMENT ON TABLE TB_NAME IS '注释的表名';
--注意:
1.该语法用于基于某查询建立新表,查询结果会作为新表的数据一并插入到表中
2.如果仅是复制某表的表结构,不要数据可以在where后面加入1=0
3.如果select后面出现函数,常量等非原始字段,需要起别民

--建立备份表:
  建表语句:表明-右键-view-view sql
  插入数据语句:查询结果-右键-export results-sql file-到处SQL文件
--修改表名
alter TABLE TB_NAME RENAME TO TB_NAME1;
--删除表和表结构,啥也没了:
drop table TB_NAME;
--删除表中数据,保留表结构:
truncate table TB_NAME;--效率比delete高,没有回滚机会,不会留下;
======================================================================
--表修改语句

--添加字段
语法:
加一个字段:ALTER TABLE TB_NAME ADD (COL_NAME COL_TYPE);
加多个字段:ALTER TABLE TB_NAME ADD (COL_NAME COL_TYPE,
                                     COL_NAME COL_TYPE,....)
注意点:
  1.列明不能出现重复
  2.添加一个字段时,括号可以省略,添加多个字段时不能省略
  
--删除字段
删除一个字段: ALTER TABLE TB_NAME DROP COLUMN COL_NAME;--不建议
删除一个或多个字段:ALTER TABLE TB_ANME DROP (COL_NAME1,COL_ANME2..);
注意点:
  1.要删除的字段已经存在
  2.删除单个字段,并且字段两边没有括号时,一定要使用 COLUNM
  3.删除多个字段,不能添加colunm关键字,而且必须加上括号
  4.不能删除所有的列,至少保留一个列
  
--修改字段
语法:
修改单个字段:alter TABLE TB_NAME MODIFY COL_NAME COL_TYPE_NEW;
修改多个字段:ALTER TABLE TB_NAME MODIFY (COL_NAME COL_TYPE_NEW,COL_NAME1 COL_TYPE_NEW,...);
COL_TYPE_NEW包括字段属性和精度
修改字段名:alter TABLE TB_NAME RENAME COLUMN COL_NAME TO NEW_COL_NAME;
--注释字段
语法:COMMENT ON COLUMN 表名.字段名 IS '字段注释';

================================================================================================
--约束
/*约束是数据库用来确保数据满足业务规则的手段,不过在真正的企业开发中,除了主键约束这类具有强需求的约束,
像外键约束,检查约束更多时候仅仅出现在数据库设计阶段,真实环境却很少应用,更多是放到程序逻辑中去进行处理。
这也比较容易理解,约束会一定程度上较低数据库性能,有些规则直接在程序逻辑中处理就可以了,同时
,也有可能在面对业务变更或是系统扩展时,数据库约束会使得处理不够方便。不过在我看来,数据库约束是保证数
据准确性的最后一道防线,对于设计合理的系统,处于性能考虑数据库约束自然可有可无;不过若是面对关联关系较为复
杂的系统,且对系统而言,数据的准确性完整性要高于性能要求,那么这些约束还是有必要的,否则,就会出现各种相
对业务规则来说莫名其妙的脏数据。总之,对于约束的选择无所谓合不合理,需要根据业务系统对于准确性和性能要求的侧重
度来决定。*/
oracle数据库的约束有五种:
  主键约束(primary key)字段中的值不能重复且不为空
  唯一约束(unique)    字段中的值不能重复
  非空约束(not null)  字段中的值不能为空
  外键约束(foreign key)字段取值来自于另一张表的某个字段
  检查约束(check)      自定义约束内容,类似于where中的条件

建立约束注意点:
1.统一用户下不能出现重复的约束名,
2.表删除时,该表下面所有约束也会全部删除
3.若表中某个字段已经违法约束,则约束不能顺利建立
4.一个约束可以建立在一个字段上,也可以建立在多个字段上

--约束命名规范
1. 默认命名:SYS_Cn(n 为正整数)
2. 指定名称:推荐如下
3. 若约束名称长度超过 30 个字节,则 "表名" 使用简称 
/*     约束类型          规范命名        名称说明

      主键约束           PK_表名_列名     Primary Key
      外键约束           FK_表名_列名     Foreign Key
      非空约束           NN_表名_列名     Not Null
      唯一约束           UK_表名_列名     Unique Key
      检查约束           CK_表名_列名     Check
      默认值                              default
*/

--约束信息查询
1. 常用视图 (权限由大到小: dba_* > all_* > user_*)
   (1) dba_constraints : 侧重约束具体信息
   (2) dba_cons_columns: 侧重约束列信息
2. 参考如下 
select * from dba_constraints dc where dc.owner = 'SCOTT' and dc.table_name = 'EMP';  
select * from dba_cons_columns dcc where dcc.owner = 'SCOTT' and dcc.table_name = 'EMP';

--添加约束
/*非空约束和唯一约束可以放在一起组成一个约束名,相当于一个主键,如果一个字段添加两个约束,
需要使用两个约束名,一个alter语句只能建立一个约束名*/
  1.唯一性约束
  alter table 表名 add constraint uk_* unique(列名) [not null];
  2.检查约束
  alter table 表名 add constraint ck_* check(列名 between 1 and 100); --列明条件,类似于where
  3.非空约束(多个约束中,not null 位于末尾)
  alter table 表名 modify(列名 constraint nk_* not null);
  4.追加默认约束
  alter table w_user modify(age default(18));

--删除约束
alter table 表名 drop constraint 约束名;

--重命名约束
alter table 表明 RENAME CONSTRAINT 约束名 to 新约束名;

--禁用启用约束 disable enable
1.禁用 disable
alter table 表名 disable constraint 约束名 [cascade];
2.启用 enable
alter table 表名 enable constraint 约束名 [cascade];

--添加主键约束
向表中添加主键约束: 
alter table 表明 add constraint pk_* primary key(添加主键的列名);
1 一个表只能有一个主键,作为主键的列具有唯一(unique)和非空约束(not null);
2 对列创建了主键约束的同时,会自动对列创建一个索引
3 可以多个字段建立联合主键x

--添加外键约束
向表中添加外键约束:
ALTER TABLE 表明 ADD CONSTRAINT FK_* FOREIGN KEY(原表名的列名) REFERENCES 外键来源的表明(外键表的列明);
1 表的外键往往对应另一个表的主键,也就是说外键是依赖主键的;
2 主外键不一定存在于不同的表,如一个表的主键对应的外键可以在同一个表里;
3 创建外键时不会创建约束;
--外键联级操作
在Oracle中,外键联级操作指的是当主表中的数据发生变化时,如何自动更新或删除从表中的数据。Oracle提供了
以下四种外键联级操作:
1. CASCADE:级联操作,当主表中的数据发生变化时,从表中的相关数据也会自动发生变化。例如,如果主表中的一条记
            录被删除,那么从表中所有与该记录相关的记录也会被删除。
2. SET NULL:将从表中与主表相关的记录的外键列设置为NULL。例如,如果主表中的一条记录被删除,那么从表中所有与该记
            录相关的记录的外键列都将被设置为NULL。
3. SET DEFAULT:将从表中与主表相关的记录的外键列设置为默认值。默认值是在创建表时指定的。例如,如果主表中的一
                条记录被删除,那么从表中所有与该记录相关的记录的外键列都将被设置为默认值。
4. NO ACTION:不执行任何操作。如果尝试删除或更新主表中的记录,而该记录在从表中有相关的记录,则会引发一个错误。
              要指定外键联级操作,需要在创建外键时使用 ON DELETE 和 ON UPDATE 子句。
例如:
CREATE TABLE orders (
  order_id NUMBER PRIMARY KEY,
  customer_id NUMBER,
  order_date DATE,
  CONSTRAINT fk_customer
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE CASCADE
    ON UPDATE SET NULL
);


--创建w_user表,同时加上约束,不设置约束名称
create table w_user(
       userid number(5) primary key,--主键,唯一且非空
       username varchar2(30) not null check(length(username ) between 4 and 20),--检查约束和非空约束
       userpwd varchar2(20) check(length(userpwd) between 4 and 18) not null,--检查约束和非空约束
       age number(3) default(18) check(age>=18),--设置默认值和检查约束
       gender char(4) default('男') check(gender in('男','女')),--默认值和检查约束
       email varchar2(30) unique,--唯一约束
       regtime date default(sysdate) --默认系统当前时间
);
--字段后接创建键语法
create table w_txt(
       txtid number(5) primary key,
       userid number(5) references w_user(userid) on delete set null
);

--创建约束带有名字的w_user表   建表时在最后添加带约束名的约束
create table w_user(
       userid number(5),
       username varchar2(30) constraint nn_user_name not null,--检查约束和非空约束
       userpwd varchar2(20) constraint nn_user_pwd not null,--检查约束和非空约束
       age number(3) default(18),--设置默认值和检查约束
       gender char(4) default('男'),--默认值和检查约束
       email varchar2(30),--唯一约束
       regtime date default(sysdate),
       constraint pk_user_id primary key(userid),--给userid追加主键约束
       constraint ck_user_name check(length(username) between 4 and 20),--给username追加check约束
       constraint ck_user_pwd check(length(userpwd) between 4 and 18),--给userpwd追加check约束
       constraint ck_user_age  check(age>=18),--给age追加check约束
       constraint ck_user_gender  check(gender in('男','女')),--给gender追加check约束
       constraint ck_uaer_email unique(email)--给email追加唯一约束
       CONSTRAINT FK_* FOREIGN KEY(原表名的列名) REFERENCES 外键来源的表明(外键表的列明)--外键
);

--创建约束带有名字的w_txt表
create table w_txt(
       txtid number(5),
       title varchar2(32) constraint nn_txt_title not null,
       txt varchar2(1024),
       pubtime date default(sysdate),
       userid number(5),
       constraint pk_txt_id primary key(txtid),
       constraint ck_txt_title check(length(title)>=4 and length(title)<=30),
       constraint fk_txt_user_id foreign key (userid) references w_user(userid)  on delete set null
);




















 

 

你可能感兴趣的:(数据库,sql,oracle)