精华内容
下载资源
问答
  • -- 创建外键(默认选项)SQL> ALTER TABLE test_sub ADD CONSTRAINT main_id_cons FOREIGN KEY (main_id) REFERENCES test_main;Table altered.删除外键约束ALTER TABLE test_sub DROP C...

    假如有主表 test_main 与 子表 test_sub
    SQL> -- 创建外键(默认选项)
    SQL> ALTER TABLE test_sub ADD CONSTRAINT main_id_cons FOREIGN KEY (main_id) REFERENCES test_main;
    Table altered.

    删除外键约束
    ALTER TABLE test_sub DROP CONSTRAINT main_id_cons;

    <!-- Baidu Button BEGIN -->
    展开全文
  • oracle外键约束的总结

    2018-04-16 19:00:59
    外键约束的创建方法 tes1的建表语句为create table test1 (hid number primary key,hname varchar2(10)); 1、创建表的同时创建外键约束 1.1、列级别 cre...
    外键约束的创建方法
    tes1的建表语句为create table test1 (hid number primary key,hname varchar2(10));
    1、创建表的同时创建外键约束

    1.1、列级别
    create table test2 (hid1 number(10) REFERENCES test1(hid),hname1 varchar2(10));--系统自动生成约束名
    create table test2 (hid1 number(10) constraint hid_pk REFERENCES test1(hid),hname1 varchar2(10));
    1.2、表级别
    create table test2 (hid1 number(10) ,hname1 varchar2(10),foreign key (hid1) REFERENCES test1(hid));--系统自动生成约束名
    create table test2 (hid1 number(10) ,hname1 varchar2(10),constraint hid_pk foreign key (hid1) REFERENCES test1(hid));

    2、表创建后再创建外键约束
    ALTER TABLE test2 ADD  FOREIGN KEY (hid1)  REFERENCES test1 (hid);--系统自动生成约束名
    ALTER TABLE test2 ADD CONSTRAINT hid_pk FOREIGN KEY (hid1)  REFERENCES test1 (hid);



    子表操作会遇到的报错
    不能修改值为父表不存在的记录
    不能插入父表不存在的记录
    create table test1 (hid number primary key,hname varchar2(10));
    create table test2 (hid1 number(10) constraint hid_pk REFERENCES test1(hid),hname1 varchar2(10));
    insert into test1 values(1,'1');
    insert into test2 values(1,'100');
    update test2 set hid1=2 where hid1=1;--报错ORA-02291: 违反完整约束条件 (HR.HID_PK) - 未找到父项关键字
    insert into test2 values(2,'100');--报错ORA-02291: 违反完整约束条件 (HR.HID_PK) - 未找到父项关键字
    drop table test2;
    drop table test1;


    父表操作遇到的报错
    create table test1 (hid number primary key,hname varchar2(10));
    create table test2 (hid1 number(10) constraint hid_pk REFERENCES test1(hid),hname1 varchar2(10));
    insert into test1 values(1,'1');
    insert into test2 values(1,'100');
    delete from test1;--报错ORA-02292: 违反完整约束条件 (HR.HID_PK) - 已找到子记录
    truncate table test1;--报错ORA-02266: 表中的唯一/主键被启用的外键引用
    drop table test1;--报错ORA-02449: 表中的唯一/主键被外键引用
    update test1 set hid=2 where hid=1;--报错ORA-02292: 违反完整约束条件 (HR.HID_PK) - 已找到子记录

    create table test1 (hid number primary key,hname varchar2(10));
    create table test2 (hid1 number(10) constraint hid_pk REFERENCES test1(hid),hname1 varchar2(10));
    insert into test1 values(1,'1');
    truncate table test1;
    drop table test1;--报错ORA-02266: 表中的唯一/主键被启用的外键引用

    create table test1 (hid number primary key,hname varchar2(10));
    create table test2 (hid1 number(10) constraint hid_pk REFERENCES test1(hid),hname1 varchar2(10));
    drop table test1;--报错ORA-02266: 表中的唯一/主键被启用的外键引用


    delete报错的解决方法
    解决方法1
    delete from test2;
    delete from test1;

    解决方法2(不保留子表记录)
    alter table test2 drop constraint hid_pk;
    ALTER TABLE test2 ADD CONSTRAINT hid_pk FOREIGN KEY (hid1)  REFERENCES test1 (hid) ON DELETE CASCADE;
    delete from test1;

    解决方法3(保留子表记录,但是字表对应字段值变成null,如下test2的hid1为null了)
    alter table test2 drop constraint hid_pk;
    ALTER TABLE test2 ADD CONSTRAINT hid_pk FOREIGN KEY (hid1)  REFERENCES test1 (hid) ON DELETE SET NULL;
    delete from test1;


    truncate报错的解决方法
    drop table test2;
    truncate table test1;

    alter table test1 disable primary key cascade;
    truncate table test1;

    alter table test1 disable primary key cascade;
    truncate table test2;
    truncate table test1;

    采用如下一样会报错
    truncate table test2;
    truncate table test1;--继续报错ORA-02266: 表中的唯一/主键被启用的外键引用


    drop报错的解决方法
    drop table test1 cascade constraints;

    drop table test2;
    drop table test1;

    采用如下一样会报错
    alter table test1 disable primary key cascade;
    truncate table test2;
    drop table test1;

    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30126024/viewspace-2152987/,如需转载,请注明出处,否则将追究法律责任。

    转载于:http://blog.itpub.net/30126024/viewspace-2152987/

    展开全文
  • Oracle 外键约束

    2019-05-16 15:48:00
    下面的语句创建department_20表,并定义和启用department_id列上的外键,该外键引用departments表的department_id列上的主键: CREATE TABLE dept_20 (employee_id NUMBER(4), last_name VARCHAR2(10), ...

    下面的语句创建department_20表,并定义和启用department_id列上的外键,该外键引用departments表的department_id列上的主键:

    CREATE TABLE dept_20 
       (employee_id     NUMBER(4), 
        last_name       VARCHAR2(10), 
        job_id          VARCHAR2(9), 
        manager_id      NUMBER(4), 
        hire_date       DATE, 
        salary          NUMBER(7,2), 
        commission_pct  NUMBER(7,2), 
        department_id   CONSTRAINT fk_deptno 
                        REFERENCES departments(department_id) ); 

     

    约束fk_deptno确保dept_20表中为员工指定的所有部门都存在于departments表中。但是,员工可以拥有空的部门编号,这意味着他们没有分配给任何部门。为了确保所有员工都被分配到一个部门,除了引用约束之外,您还可以在dept_20表的department_id列上创建一个非空约束。

    在定义和启用此约束之前,必须定义并启用departments表的department_id列的主键或唯一约束。

    外键约束定义不使用foreign key子句,因为约束是以内联方式定义的。不需要Department_ID列的数据类型,因为Oracle会自动为此列分配引用键的数据类型。

    约束定义标识被引用键的父表和列。因为被引用的键是父表的主键,所以被引用的键列名是可选的。

    或者,您可以不按行定义此外键约束:

    CREATE TABLE dept_20 
       (employee_id     NUMBER(4), 
        last_name       VARCHAR2(10), 
        job_id          VARCHAR2(9), 
        manager_id      NUMBER(4), 
        hire_date       DATE, 
        salary          NUMBER(7,2), 
        commission_pct  NUMBER(7,2), 
        department_id, 
       CONSTRAINT fk_deptno 
          FOREIGN  KEY (department_id) 
          REFERENCES  departments(department_id) ); 

     

    此语句两个变体中的外键定义都省略了on delete子句,从而导致Oracle在某个部门中有员工工作时,阻止删除该部门。

    ON DELETE 示例

    此语句创建dept_20表,定义并启用两个引用完整性约束,并使用on delete子句:

    CREATE TABLE dept_20 
       (employee_id     NUMBER(4) PRIMARY KEY, 
        last_name       VARCHAR2(10), 
        job_id          VARCHAR2(9), 
        manager_id      NUMBER(4) CONSTRAINT fk_mgr
                        REFERENCES employees ON DELETE SET NULL, 
        hire_date       DATE, 
        salary          NUMBER(7,2), 
        commission_pct  NUMBER(7,2), 
        department_id   NUMBER(2)   CONSTRAINT fk_deptno 
                        REFERENCES departments(department_id) 
                        ON DELETE CASCADE ); 

     

    由于第一个on delete子句,如果从Employees表中删除了经理编号2332,则Oracle将dept_20表中以前拥有经理2332的所有员工的经理ID值设置为空。

    由于存在第二个on delete子句,Oracle将departments表中department_id值的任何删除操作级联到department_20表中依赖行的department_id值。例如,如果从Departments表中删除Department 20,则Oracle将从Department_20表中删除Department 20中的所有员工。

    复合外键约束示例

    以下语句定义并启用dept_20表的employee_id和hire_date列组合的外键:

    ALTER TABLE dept_20
       ADD CONSTRAINT fk_empid_hiredate
       FOREIGN KEY (employee_id, hire_date)
       REFERENCES hr.job_history(employee_id, start_date)
       EXCEPTIONS INTO wrong_emp;

    约束fk_empid_hiredate确保dept_20表中的所有员工都具有员工表中存在的员工ID和雇用日期组合。在定义和启用此约束之前,必须定义并启用一个约束,该约束将Employees表的Employee_ID和Hire_Date列的组合指定为主键或唯一键。

    EXCEPTIONS INTO 子句导致Oracle将有关dept_20表中违反约束的任何行的信息写入 wrong_emp表。如果 wrong_emp 异常表不存在,则此语句将失败。

    转载于:https://www.cnblogs.com/zhaochunyi/p/10876038.html

    展开全文
  • Oralce的二维表操作 --创建表并同时添加约束 --主键约束 --非空约束 ... --外键约束 --简单的表创建和字段类型 --简单的创建语句: create table student( sno number(10) ,--primary key ...

    Oralce的二维表操作

        --创建表并同时添加约束
          --主键约束
          --非空约束
          --检查约束
          --唯一约束
          --外键约束

        --简单的表创建和字段类型
        --简单的创建语句:
          create table student(
               sno number(10) ,--primary key
               sname varchar2(100) ,--not null
               sage number(3), --check(sage<150 and sage>0)
               ssex char(4) ,--check(ssex='男' or ssex='女')
               sfav varchar2(500),
               sbirth date,
               sqq varchar2(30) --unique
               --constraints pk_student_sno primary key(sno)--添加主键约束
               --constraints ck_student_sname check(sname is not null)--非空约束
               --constraints ck_student_sage check(sage<150 and sage>0)--检查约束
               --constraints ck_student_ssex check(ssex='男' or ssex='女')--检查约束
               --constraints un_student_sqq unique(sqq)--唯一约束
          )   
          --添加主键约束
            alter table student add  constraints pk_student_sno primary key(sno);
            alter table student drop  constraints pk_student_sno;
          --添加非空约束
            alter table student add  constraints ck_student_sname check(sname is not null);
            alter table student drop  constraints ck_student_sname;
          --添加检查约束
            alter table student add constraints ck_student_sage check(sage<150 and sage>0)
            alter table student drop  constraints ck_student_sage;
          --添加检查约束校验性别
            alter table student add constraints ck_student_ssex check(ssex='男' or ssex='女')
            alter table student drop  constraints ck_student_ssex;
          --添加唯一约束
            alter table student add constraints un_student_sqq unique(sqq)
            select * from student
            drop table student

    二维表创建约束学习问题:
        --问题1:学号重复依然可以添加
           insert into student values(1,'关晓彤',18,'女','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
           insert into student values(1,'关晓彤001',18,'女','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
        --问题2:竟然可以没有名字
           insert into student values(2,'',18,'女','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
        --问题3:年龄竟然可以超过200岁
           insert into student values(3,'关晓彤002',300,'女','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
        --问题4:性别竟然可以为任意字符
           insert into student values(4,'关晓彤',18,'a','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
        --问题5:qq号竟然可以重复
           insert into student values(5,'关晓彤003',18,'女','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
           insert into student values(6,'关晓彤004',18,'女','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
    ---问题解决:
        --问题1:使用主键约束,主键特点:非空唯一
           --使用:
                --直接在创建表的字段后使用 primary key
                --在创建表的语句的最后面使用 constraints pk_表名_字段名 primary key(字段名)
                --在创建表后使用 alter table 表名 add  constraints pk_表名_字段名 primary key(字段名);
                --删除主键     alter table student drop  constraints 主键的约束名;
        --问题2:使用非空约束
           --使用:
                --直接在创建表的字段后使用 not null 关键字
                --在创建表的语句的最后面使用 constraints ck_表名_字段名 check(字段名 is not null)
                --在创建表后使用 alter table 表名 add  constraints ck_表名_字段名 check(字段名 is not null);
                --删除非空约束 alter table student drop  constraints 非空约束名;
        --问题3:使用检查约束
                --直接在创建表的字段后使用 check(条件) 例如      sage number(3) check(sage<150 and sage>0),
                --在创建表的语句的最后面使用 constraints ck_表名_字段名 check(条件)
                --在创建表后使用 alter table 表名 add  constraints ck_表名_字段名 check(条件);
                --删除检查约束 alter table student drop  constraints 检查约束名;

        --问题4:使用检查约束
                --直接在创建表的字段后使用 check(条件)
                --在创建表的语句的最后面使用 constraints ck_表名_字段名 check(条件)
                --在创建表之后使用alter table 表名 add  constraints ck_表名_字段名 check(条件);
                --删除检查约束 alter table 表名 drop  constraints 检查约束名;
        --问题5:使用唯一约束
                --直接在创建表的字段后使用 unique
                --在创建表的语句后面使用 constraints un_表名_字段名 unique(字段名);
                --在创建表后使用 alter table 表名 add  constraints un_表名_字段名 unique(字段名);
                --删除约束:alter table 表名 drop  constraints 唯一约束名;

    二维表创建 外键约束学习:
       --创建学生表
       create table student(
             sno number(10) primary key,
             sname varchar2(100) not null,
             sage number(3) check(sage>0 and sage<150),
             ssex char(4) check(ssex='男' or ssex='女'),
             sfav varchar2(500),
             sqq varchar2(30) unique,
             cid number(10) --references clazz(cno)
             --constraints fk_student_cid foreign key(cid) references clazz(cno)--外键
          )
          --添加外键
          alter  table student add constraints fk_student_cid foreign key(cid) references clazz(cno) on delete set null
          alter  table student drop constraints fk_student_cid
          drop table student
          --添加测试数据
          insert into student values(1,'张三001',18,'男','唱歌','657889900',1);
          insert into student values(2,'张三002',18,'男','唱歌','657889901',1);
          insert into student values(3,'李四001',18,'男','唱歌','657889903',2);
          insert into student values(4,'李四002',18,'男','唱歌','657889904',2);
       --创建班级表
          create table clazz(
           cno number(10) primary key,
           cname varchar2(100) not null,
           cdesc varchar2(300)
          
          )
          --添加测试数据
           insert into clazz values(1,'java高薪就业班','6666');
           insert into clazz values(2,'python高薪就业班','33333');
      --查询学生及其班级信息
          select * from student  s
          inner join clazz c
          on s.cno=c.cno
      --问题:竟然可以在学生表中插入一个不存在班级
          insert into student values(5,'李四003',18,'男','唱歌','657889905',3);
      --使用外键:
          --作用:当在子表中插入的数据在父表中不存在,则会自动报错。
          --概念:当一张表的某个字段的值需要依赖另外一张表的某个字段的值,则使用外键约束。
                 --其中主动依赖的表称为子表,被依赖的表称为父表。外键加在子表中。
          --使用:
                 --在子表中的字段后直接使用   references 父表名(字段) 例如: cid number(10) references clazz(cno)
                 --在创建表语句的最后面使用  constraints fk_子表名_字段名 foreign key(字段名) references 父表名(字段名)
                 --在创建表后使用:alter table 表名 add constraints fk_子表名_字段名 foreign key(字段名) references 父表名(字段名)
                --删除外键:alter table 表名 drop constraints 外键约束名
          --外键选取:
                --一般选取父表的主键作为子表的外键。
          --外键的缺点:
                --无法直接删除父表数据,除非级联删除
                --级联删除:在添加外键约束时,使用关键字 on delete cascade
                         --使用:当删除父表数据时,自动删除子表相关所有数据。
                         --缺点:无法保留子表历史数据。
                         --使用关键字 on delete set null
                               --删除父表数据时,将子表中的依赖字段的值设置为null。
                               --注意:子表依赖字段不能添加非空约束。
               --删除班级1的信息
               select * from student
               delete from clazz where cno=1

    展开全文
  • oracle 主键 外键

    2015-06-09 18:49:36
    外键约束用于创建两个表的关系。 建立外键时需注意:1、建立外键是让两个表有关联,与多表查询没关系。  2、建立外键也为了保证数据的完整性,对DML语言有作用,比如增加和删除语句。 建立主键约束----实例1: ...
  • ---Oralce的二维表操作 --创建表并同时添加约束 --主键约束 --非空约束 ... --外键约束 --简单的表创建和字段类型 --简单的创建语句: create table student( sno number(10) ,--primary ...
  • Oracle外键

    2018-03-22 10:33:00
    Oracle外键约束简介 外键就是表与表的关系,比如:一个表的一例引用另外一个表的一列。 我们从一个简单例子开始,清楚地理解它的概念。 假设,有两个表:supplier_groups和supplier 分别用来存储供应商分组和供应...
  • a、eg:创建时添加主键约束 create table IDS_FILE ( FILE_LIST_ID VARCHAR2(20), CONTENT BLOB, FILE_NAME VARCHAR2(256), primary key(FILE_LIST_ID); ) b、eg:使用Alter Table语句为表添加主键约束 ...
  • Oracle-创建约束

    2019-11-27 22:17:48
    ---Oralce的二维表操作 --创建表并同时添加约束 --主键约束 --非空约束 ... --外键约束 --简单的表创建和字段类型 --简单的创建语句: create table student( sno number(10) ,--primary key ...
  • 因为现在做维护,在需要重新导入某表时,发现该表有外键约束,此时该表是不能删除的,此时你需要暂时删除外键,然后重导数据后在手动创建外键约束。查询某表外键的语句如下:selectc1.table_nameasorg_table_name,c1...
  • ORACLE对数据库完整性的约束: 三种方法维护数据完整性:ORACLE完整性约束,数据库触发器,应用程序代码。 应尽量使用ORACLE完整性约束,可靠性和效率高,容易修改,使用灵活,记录在数据字典。 ORACLE五种约束: ...
  • 外键列没有索引,容易导致enq: TM - contention...(1)下面的sql语句可以定位出哪些外键约束没有创建索引。 SELECT table_name, constraint_name,   cname1   || NVL2 (cname2, ',' || cname2, NULL)   || NVL2
  • Oracle 学习:约束、查询语句

    千次阅读 2016-07-24 22:37:32
    外键约束 唯一约束 检查约束 数据字典(user_constraints)1. 约束的作用 定义规则 确保数据完整性(精确性和可靠性) 2. 非空约束1 > 在创建表的时候设置非空约束CREATE TABLE table_name (column_name datatype ...
  • 方法一:直接在sql语句中声明字段主键约束 create table table_name (id type[length]constraintpk_nameprimary key,name tyoe[length],age type[length],class_id); 方法二:alter更改表添加约束 alter table ...
  • 1、主键的创建方法一:直接在sql语句中声明字段主键约束create table table_name (id type[length] constraint pk_name primary key,name tyoe[length],age type[length],class_id);方法二:alter更改表添加约束alte...
  • oracle对表添加主键约束的sql语句

    万次阅读 2017-02-27 08:57:46
    创建主外键(可以在创建表的同时添加主外键约束,也可以  –创建完成后再添加约束 ) —–方法一:表创建的同时,添加主键约束 语法: create table 表名  (  列名1 数据类型及长度 constraint 主键名称...
  • 创建主外键(可以在创建表的同时添加主外键约束,也可以 –创建完成后再添加约束 )
  • 1. Oracle数据库创建外键和删除外键 参考地址:https://zhidao.baidu.com/question/244618131.html 假如有bai主表 test_main 与 子表 test_sub创建外键(默认选项): SQL> ALTER TABLE test_sub ADD CONSTRAINT ...
  • 关于oracle中的约束

    2014-02-10 10:59:00
    oracle中约束用constraint表示: 主要分为五个约束: 1.primary key 主键约束 ...5.foreign key 外键约束 下面是创建表中各个约束的sql语句例子: create table users(  id varchar2(10),  name varchar...
  • 集合运算多个查询语句的结果可以做集合运算,结果集的字段类型、数量和顺序应该一样。Oracle共有4个集合操作UNION:并集,合并两个操作的结果,去掉重复的部分UNION ALL:并集,合并两个操作的结果,保留重复的部分...

空空如也

空空如也

1 2 3 4
收藏数 77
精华内容 30
关键字:

oracle创建外键约束语句