`
hainianqinas
  • 浏览: 82773 次
  • 性别: Icon_minigender_1
  • 来自: 黑龙江
社区版块
存档分类
最新评论

alter约束操作

阅读更多

1、创建表的同时创建主键约束
一、无命名
create table accounts (
accounts_number number primary key,
accounts_balance number
);
二、有命名
create table accounts (
accounts_number number primary key,
accounts_balance number,
constraint yy primary key(accounts_number)
);

2、删除表中已有的主键约束
一、无命名
SELECT * FROM USER_CONS_COLUMNS WHERE TALBE_NAME='accounts';
找出主键名
ALTER TABLE ACCOUNTS DROP CONSTRAINT SYS_C003063;
二、有命名
ALTER TABLE ACCOUNTS DROP CONTRAINT yy;

3、向表中添加主键约束
ALTER TABLE ACCOUNTS ADD CONSTRAINT PK_ACCOUNTS PRIMARY KEY(ACCOUNTS_NUMBER);

oracle中not null约束是我们用到的最多的约束之一了。我们可以在创建表时让系统自动指定not null约束的名字来创建,也可以手动的的指定not null约束的名字来创建,也可以在表创建好后手动的修改表已达到增加not null约束的目的。

下面是一个例子
create table test_not_null
(id number not null,
name varchar2(30) ,
tel varchar2(20) constraint test_not_null_tel not null);

在这里我们创建了一个表,并分别给id 和 tel两列创建了not null的约束,其中id的约束是系统自动命名的,而tel的约束使我们手动命名的。对于地二个列name,oracle系统不会自动增加not null的约束。

我们可以在这个表里面插入一行数据,例如:
insert into test_not_null(id,tel) values(123,’88888888′);

我们也还可以使用修改表的方式来增加not null约束。例如刚才我们没有在test_not_null上建立空值约束,我们可以现在通过修改的方式来建立
alter table test_not_null
modify(name not null);

如果你执行了刚才我们的插入数据的操作,你执行这句话的时候可能会有以下错误:
ORA-02296: 无法启用 (SYS.) - 找到空值

这是因为我们刚才在插入数据时已经给name这一列增加了一个空值,现在又要在这一列上增加not null约束,显然是不行的。
如果实际问题中我们真的遇到这种需求,例如对于某个字段我们认为原来可以为空,并且再该列插入了很多空值,后来我们发现实际上是不应该为空的,可能会需先将原来的空值全部更新到一个新的有统一意义的值,然后在进行空值约束的加入操作。例如我们可以这样做:
update test_not_null
set name = ‘不知道’
where name is null;

现在我们再增加列的not null约束是没有问题了。
alter table test_not_null
modify(name not null);

      1、创建表的同时创建主键约束
                        (1)无命名 create table student (studentid int primary key not null,
                                                          studentname varchar(8),age int);
                        (2)有命名 create table students (studentid int ,studentname varchar(8),
                                                    age int,constraint yy primary key(studentid));
     2、删除表中已有的主键约束
                        (1)有命名 alter table students drop constraint yy;
                        (2)无命名 可用 SELECT * from user_cons_columns where ..;
                             查找表中主键名称得student表中的主键名为SYS_C002715
                             alter table student drop constraint SYS_C002715;
                      (3) 使约束失效:
                             alter table tbl_employee disable constraint fk_emp;
                     删除约束:
                            alter table tbl_department drop constraint pk_dept;
                     查询约束:
select CONSTRAINT_NAME from user_constraints where table_name='TBL_EMPLOYEE';
select CONSTRAINT_NAME,COLUMN_NAME from user_cons_columns where table_name='TBL_EMPLOYEE';
     3. 删除表.
          Drop table table_name;
4、操作表数据
           插入表记录:
            ①. a. insert into table_name col1,col2 values (val1,val2);
例:Insrt into xs(xh,xm,) values (‘09’,to_date(‘19860210’,’yyyymmdd’));
                    insert into    depto values('100','xieyunchao','m','22',to_date('19861104','yyyy-mm-dd'),10000)
                 b.从一个表中向另一个表中插入数据
             Insert into table1(col1,col2,col3) select (col1,col2,col3)
                   from othertable
                 c.使用子查询插入数据
                     insert into employee (empno,ename,sal,deptno)
                              select empno,ename,sal,depto from emp;
                d.INSERT INTO EMP (ENAME,HIREDATE) VALUE(‘AA’,TO_DATE(‘1980-12-09’,’YYYY-MM-DD’))
      ③. 删除表数据:
         Delete from table_name where condition;
      ④. 修改表记录
         Update table_name set column_name=expression,…where condition.
                基于一张表修改另一张表的数据
                  UPDATE EMPLEE SET DEPTNO=(SELECT DENPNO FROM EMP WHERE EMPNO=7788)
                                 WHERE JOB=(SELECT JOB FROM EMP WHERE EMPNO=7788)
      ⑤. 删除所有记录但保留表结构.
         Truncate table table_name;
      ⑥.查询数据
               查询表结构:DESC table_name
         Select ename,sal,12*sal+100 from emp
               注:select count(dinstinct(deptno)) from emp
               a.查询大于平均的:
                  select empno from emp a,(select avg(sal) as sal_sal from emp) b
                         where a.sal>b.sal_sal;
       如果列中有空值时,则结果也为空(关于null值的处理(p47)).
         如:select ename,name,12*sal+comm如果comm的值为null,结果也为null;
                      如上所示,comm为null时.则12*sal+comm也为null;解决方法是用nvl方法替换.
              在两个表中查询:以下两种方式都是一样的.
                  a.select t_phone_operation.operation_name
                                                from t_phone_operation ,t_phone_operation_charge
                                                where t_phone_operation.operation_id=t_phone_operation_charge.operation_id and
                                                                                    t_phone_operation_charge.phone_num=’159..’;
                                   b.select operation_name from t_phone_operation where operation_id in (select operation_id from t_phone_operation_charge where phone_num='159...'
使用日期格式显示日期:
select ename,to_char(hiredate,’yyyy—mm---dd’) from emp
select ename where hiredate>to_date(‘1999-12-31’,’yyyy-mm-dd’);
             

              使用别名的三种方式:
                  a.    select ename as name,sal salary,from emp
                  b.    select ename ” name”, sal*12 ”annual salary”
              使用连接操作符:
                  Select ename || job as “employees” from emp
              用连接字符:
                  Select ename ||’ ’||’ is a ’||’ ’||job as “employee details”
              限制重复的行:
                  Select distinct deptno from emp
              注意大小写:
                  Select ename,job,deptno from emp where job=’CLERK’
              使用between ….and 运算符
                  Select ename,sal from emp where sal between 1000 and 1500;
              使用in 运算符
                  Select empno,ename,sal,mgr from emp where mgr in(23,231,2345);  
              Like运算符:(模糊查询)
                  %代表至多任意字符
                 _代表一个任意字符
                        如:select ename from emp where ename like ’s%’;
                  显示第三个字符为大写A的所有信息
                        SELECT ENAME ,SAL FROM EMP WHERE ENAME LIKE '__A%';
                  显示雇员名包含"_"的雇员信息(其中ESCAPE后的字符a为转义字符)
                        SELECT ENAME,SAL WHERE ENAME LIKE '%a_% ESCAPE 'a';
             Null运算符(关于null值的处理(p47):)
                测试一个值是否为空:
                        Select ename,mgr from emp where mgr is null (注意是is null ,不是=null)
             使用NVL函数处理NULL值
                 NVL函数用于将NULL转换为实际值,其语法为NVL(exp1,exp2).如果是exp1 是null,则返回
                 exp2,如果exp1不为null,则返回exp1,参数exp1和exp2是任意相同的数据类型.
                 如:
                 SELECT ENAME, SAL,SAL+NVL(COM,0) AS "月收入" from EMP;
             使用NVL2函数处理NULL值
                语法为NVL(exp1,exp2,exp3),如果exp1不是null,则返回exp2,如果exp1是null,则返回exp3;
             用WHERE语句限制日期
                示例一.符合默认日期格式
                  select * from emp where hiredate>'01-1月-82'
                示例2:不符合默认日期格式(需要用TO_DATE函数转换)
                  SELECT * FROM EMP WHERE HIREDATE>TO_DATE('1994-9-24','yyyy-mm-dd');
            逻辑操作符:And or not
            Order by 子句
                       a.   使用order by 子句对查询数据排序
                             ―――asc:升序,默认
                             ―――desc:降序:

                       依据多列进行排序:
                             Select ename,deptno,sal from emp order by deptno,sal desc
                总结:
                SELECT    [DISTINCT] {*,COLUMN[ALIAS],…..}    //DISTINCT不重复
                FROM      tablename
                WHERE     condition
                ORDER BY   {column,expr,alias} [ASC|DESC]
            分组查询:
           常用分组函数:
                MAX , MIN ,AVG ,SUM,COUNT,VARIANCE(取方差),STDDEV(取标准差)
●     当使用分组函数时,分组函数只能出现在选择列表,order by ,和having子句中,而不能出现在where 和group by子句中.
●     当执行SELECT 语句时,如果选择列表同时包含列,表达式,和分组函数,那么这些列和表达式必须出现在GROUP BY子句中.  
select deptno,avg(sal),count(*) from emp group by deptno;
        having avg(sal)<2000;
●如果在select 语句中同时包含group by ,    having ,以及order by子句,则必须将order by子句放在最后.
●当限制分组结果时,必须要使用having ,而不能在WHERE 子句中使用分函数限制分组显示结果.
子查询:
    子查询的作用:
●     在insert 或create table 语句中使用子查询,可以将表数据插入到目标表中.
●     通过update 子句中使用子查询,可以修改一列事多列数据.
●     通过在where ,having,start with 子句中使用子查询,可以提供条件值.
单行子查询:
select ename ,sal,deptno from emp where deptno=(select deptno from emp where ename=’scott’)
多行子查询:
select ename ,job,sal,deptno from emp where job in
(select distinct job from emp where deptno=10)
使用比较符:
IN:匹配子查询结果中的任何一个就可以(见上例).
ALL:必须要符合子查询结果中的所有值.
ANY:只要符合子查询结果中的任何一个就可以.
ALL的使用:
SELECT ENAME,SAL,DEPTNO FROM EMP WHERE SAL>ALL
       (SELECT SAL FROM EMP WHERE DEPTNO=30)
ANY 的使用:
   SELECT ENAME,SAL,DEPTNO FROM EMP WHERE SAL>ANY
(SELECT SAL FROM EMP WHERE DEPT=’30’)
                多列子查询:
                    SELECT ENAME ,JOB,SAL,DEPTNO FROM EMP WHERE (DEPTNO,JOB) =
                        (SELECT DEPTNO,JOB FROM EMP WHERE ENAME =’SMITH’)
SELECT ENAME,SAL ,COMM,DEPTNO FROM EMP WHERE (SAL,NVL(COMM,-1)) IN (SELECT     SAL,NVL(COMM,-1)FROM EMP WHERE DEPTNO=30)
           





            ⑦.删除表数据:
                    Delete from table_name where condition;
                    DELETE FROM EMP WHERE DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME=’SALES’)
            ⑧. 修改表记录
                    Update table_name set column_name=expression,…where condition.
                    UPDATE TABLE_NAME SET COL1=A*1.1,COL2=B*2 WHERE
                    更新日期:
                    UPDATE TABLE_NAME SET HIREDATE =TO_DATE(‘1987/12/1’,’YYYY/MM/DD’);
                    更新关连数据
                    UPDATE EMP SET (ENAME,SAL,COMM)=(SELECT ENAME,SAL,COMM FROM EMP WHERE ENAME=’XX’)WHERE ENAME=’YY’
                    复制其他表数据
                    UPDATE EMPLEYEE SET DEPTNO=(SELECT DEPT FROM EMP WHERE EMPNO=7788)WHERE JOB=(SELECT JOB FROM EMP WHERE EMPNO=7788)
            ⑨.删除所有记录但保留表结构.
                    Truncate table table_name;
                   
            ⑩.事务
             a. 当出现下面的事件时,事务便结束
                  ①. commit or rollback 被执行时.
                  ②. Ddl or dcl被执行时.create or drop 等
                  ③. 用户退出.
                  ④. 系统中止或当机.
             b. 事务保存点.
               update ....
                  savepoint update_done
                  insert ....
                  rollback TO update_done

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rodger004/archive/2008/06/06/2517469.aspx

分享到:
评论

相关推荐

    mysql alter table命令修改表结构实例详解

    mysql alter table语句可以修改表的基本结构,例如添加字段、删除字段、添加主键、添加索引、修改字段数据类型、对表重命名等等操作,本文章通过两个简单的实例向大家介绍mysql alter table的使用方法。  实例一:...

    值得收藏的好文——postgresql 增加约束、删除约束、增加列、删除列

    1.需要明确操作哪个表 2.需要知道约束的名称[可以是主键约束,外键约束,check约束,unique约束] 3.这对除了非空约束之外所有的约束类型都一样有效 移除非空约束 alter table table_name alter column ID drop not ...

    mysql alter table命令修改表结构实例

    mysql alter table语句可以修改表的基本结构,例如添加字段、删除字段、添加主键、添加索引、修改字段数据类型、对表重命名等等操作,本文章通过两个简单的实例向大家介绍mysql alter table的使用方法  实例一:...

    mysql数据库的基本操作语法

    上面的table加上了非空约束,也可以用alter来修改或增加非空约束 增加非空约束 alter table temp modify sex varchar(2) not null; 取消非空约束 alter table temp modify sex varchar(2) null; 取消非空约束,...

    mysql数据库设计(1).pdf

    添加级联操作 语法:ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE ; 2. 分类: 1. 级联更新:ON UPDATE CASCADE 2...

    mysql触发器详解!!!

    触发器有如下作用: 可在写入数据表前,强制检验或转换数据。 触发器发生错误时,异动的结果会...ALTER 语句,如:ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。 DROP 语句,如:DROP DATABASE、DROP TABLE、DROP IN

    sql 触发器 详解与实例

    触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。SQL Server ...

    MySQL数据表添加字段

    ALTER TABLE &lt;表名&gt; ADD &lt;新字段名&gt;&lt;数据类型&gt;[约束条件]; 对语法格式的说明如下: &lt;表名&gt; 为数据表的名字; &lt;新字段名&gt; 为所要添加的字段的名字; &lt;数据类型&gt; 为所要添加的字段能存储数据的数据类型; [约束...

    数据库系统基础教程-第4章-高级数据库模型.pptx

    数据结构:属性、元组、关系(关系运算)、视图、索引 数据操作:DDL(create/alter/drop)、DML(select/insert/delete/update)、事务、游标、存储过程 数据的约束:主键、外键、check约束、触发器、断言 2022/6/...

    2009达内SQL学习笔记

    rollback:回溯,回溯到上次操作前的状态,把这次事务操作作废,只有一次(DDL和DCL语句会自动提交,不能回溯)。 可以用commit语句提交,这样就回溯不回了。 set pause on\off :设置分屏(设置不分屏) set pause...

    mysql更新数据详细说明文档

    常用的修改表的操作有修改表名、修改字段数据类型或字段名、增加和删除字段、修改字段的排列位置、更改表的存储引擎、删除表的外键约束等。 常用的语法格式如下: ALTER TABLE &lt;表名&gt; [修改选项] 修改选项的语法...

    基于java实现的数据库管理系统.pdf

    基本功能如下: 实现创建表,并把约束条件存储到建⽴好的数据字典中 为表添加删除列操作和删除表操作 实现对表数据的插⼊操作,并实现插⼊前约束检测 实现对表数据删除操作 实现对表数据的修改操作,修改前对修改...

    北邮数据库实验5数据库完整性与安全性

    1. 通过对完整性规则的定义实现,熟悉...本实验将针对这11张表,采用alter table语句,添加主键、候选键、外键、check约束、缺省/默认值约束,并观察当用户对数据库进行增、删、改操作时,DBMS如何维护完整性约束。

    DBA常用SQL

    novalidate enable 约束"&gt;第一章:写简单的sql语句 SQL&gt; alter user scott account unlock; SQL&gt; alter user scott identified by tiger; SQL&gt; conn scott tiger 1 使用算术操作符 SELECT last name salary...

    最全的oracle常用命令大全.txt

    数据字典里存有用户信息、用户的权限信息、所有数据对象信息、表的约束条件、统计分析数据库的视图等。 我们不能手工修改数据字典里的信息。  很多时候,一般的ORACLE用户不知道如何有效地利用它。  dictionary...

    Oraclet中的触发器

    (1)触发器能够实施的检查和操作比主键和外键约束、CHECK约束和规则对象等更为复杂。 (2)触发器建立在表一级,它与特定的数据修改事件相对应。 触发器类型 触发器在数据库里以独立的对象存储,它与存储过程不同...

    DDL、DML和DCL的区别与理解.zip_DDL、DML和DCL的区别与理解_drop

    DDL、DML和DCL的区别与理解 ...DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。

    数据库表ERP表参考。仅供参考

    --alter table PrizeAmerceRecord add constraint FK_prize_prizetid foreign key(prize_prizetId) references PrizeAmerceType(prizet_id) alter table PrizeAmerceRecord add constraint DF_prize_desc default('...

    21天学会SQL

    3.3.2 用ALTER DATABASE语句 修改数据库 60 3.3.3 用DROP DATABASE语句 删除数据库 62 3.4 附加与分离数据库 63 3.4.1 分离数据库 63 3.4.2 附加数据库 64 3.5 编写数据库脚本文件 66 3.6 综合练习 67 3.7 小结 69 ...

    oracle Session与lock 解除

    但DDL(alter,drop等)操作会提示ora-00054错误。 有主外键约束时 update / delete ... ; 可能会产生4,5的锁。 DDL语句时是6的锁。 以DBA角色, 查看当前数据库里锁的情况可以用如下SQL语句: select ...

Global site tag (gtag.js) - Google Analytics