zoukankan      html  css  js  c++  java
  • 数据库主键、外键、唯一等约束

    主键(primary key)约束、外键(foreign key)约束、唯一(unique)约束、检查(check)约束、默认值(default)约束实例

    Oracle 有如下类型的约束:
    NOT NULL(非空)、UNIQUE Key(唯一约束)、PRIMARY KEY(主键约束)、FOREIGN KEY(外键约束)、CHECK约束
    Oracle使用SYS_Cn格式命名约束.
    创建约束:在建表的同时创建、建表后创建
    约束的类型有如下几种:
    C (check constraint on a table)
    P (primary key)
    U (unique key)
    R (Referential AKA Foreign Key)
    V (with check option, on a view)
    O (with read only, on a view)
    1、创建约束
    CREATE TABLE students(
    student_id VARCHAR2(10) NOT NULL,
    student_name VARCHAR2(30) NOT NULL,
    college_major VARCHAR2(15) NOT NULL,
    status VARCHAR2(20) NOT NULL,
    state VARCHAR2(2),
    license_no VARCHAR2(30)
    ) TABLESPACE student_data;
    2、创建主键:
    ALTER TABLE students ADD CONSTRAINT pk_students PRIMARY KEY (student_id)
    USING INDEX TABLESPACE student_index;
    Alter table table_name add constrants BID primary key (bookno);
    ALERT TABLE table_name MODIFY( column1 PRIMARY KEY);
    3、创建Unique约束:
    ALTER TABLE students ADD CONSTRAINT uk_students_license UNIQUE (state, license_no)
    USING INDEX TABLESPACE student_index;
    4、创建Check约束:定义每一记录都要满足的条件,条件表达式不允许有:CURRVAL, NEXTVAL, LEVEL, ROWNUM,SYSDATE, UID, USER, USERENV 函数:
    ALTER TABLE students ADD CONSTRAINT ck_students_st_lic CHECK ((state IS NULL AND license_no IS NULL) OR (state IS NOT NULL AND license_no is NOT NULL));
    添加check约束(check_1为约束名,dept_salary为字段名 )     
    alter table emp add constraint check_1 check(dept_salary>0);      
    5、创建外键约束:
    ALTER TABLE students ADD CONSTRAINT fk_students_state FOREIGN KEY (state) REFERENCES state_lookup (state);
    6. 创建不能为空约束 not null
    alter table table_name modify(name not null);
    alter table table_name modify name1 varchar2(20) not null;

    实例1:
    首先创建学生信息表studentinfo和学生成绩表testinfo。
    --学生信息表
    CREATE TABLE studentInfo (
    stuNo CHAR(10) NOT NULL ,
    stuName VARCHAR2(20) NOT NULL,
    stuSex NUMBER(1),
    stuBirthday DATE DEFAULT SYSDATE ,
    stuAddress VARCHAR2(20)
    );
    --学生成绩表
    CREATE TABLE testInfo (
    stuNo CHAR(10) NOT NULL ,
    classNo CHAR(5) NOT NULL,
    testScore NUMBER(3,1)
    );
    --约束条件:设置主键
    alter table testinfo add constraint fk_1 foreign key (stuno) references studentinfo(stuno);
    --约束条件:设置外键
    alter table studentinfo add constraint pk_1 primary key (stuno);
    --约束条件:设置唯一
    alter table testinfo add constraint uniq_1 unique (stuno,classno);

    主键、外键、唯一约束、check约束、非空约束等约束详解实例:
    1、--创建表
    create table tb_Dept
    (
    Deptid char(2) Primary key,
    DeptName char(16) Not Null
    )
    2、--外键约束
    create table tb_Student
    (
    Studid char(10) Primary key,
    Studname char(8) Not null,
    Deptid char(2) Not null,
    Constraint FK_DeptID Foreign Key (Deptid)
    References Tb_Dept(DeptID)
    )
    3、--外键约束简化形式,必须要求tb_Dept表中DeptID为主键,且数值类型相同
    create table Tb_Student
    (
    StudId char(10) Primary key,
    StudName char(8) Not null,
    DeptID char(2) not null References Tb_Dept
    )
    4、--创建表,无主键
    create table Tb_Class
    (
    ClassID char(8) not null,
    ClassName varchar(30) not null,
    DeptId char(2) not null,
    ClassStuNumber int
    )
    5、--创建表,同时定义主键
    create table Tb_Class
    (
    classid char(8) not null,
    ClassName varchar(30) not null,
    DeptID char(2) not null,
    ClassStuNumber int
    constraint PK_ClassID Primary key
    (ClassID,ClassName)
    )
    6、--新增主键
    Alter table Tb_class ADD Constraint PK_ClassID primary key(Classid)
    7、--删除主键
    Alter table tb_Class Delete Constraint PK_ClassID Primary key(ClassID)
    8、--外键级联更新,删除,简化形式
    Create table tb_student
    (
    studID char(10) Primary key,
    StudName char(10) not null,
    DeptID char(2) not null References tb_Dept
    On Update cascade
    on delete cascade
    )
    9、--外键级联更新,删除,标准
    create table tb_student
    (
    studid char(10) Primary key,
    StudName char(8) not null,
    DeptID char(2) not null,
    Constraint FK_Deptid foreign key(DeptID)
    References Tb_Dept(DeptID)
    on update Cascade
    on delete cascade
    )
    10、--创建无外键的表
    create table tb_student
    (
    studId char(10) Primary key,
    StudName char(8) not null,
    DeptID char(2) not Null
    )
    11、--给相应的列(DeptID)添加外键约束
    Alter table tb_Student ADD Constraint FK_DeptID Foreign key(DeptID) References tb_Dept(DeptID)
    12、--删除外键约束
    Alter table tb_Student Drop Constraint fk_DeptID
    13、--创建表是创建Unique约束
    Create table tb_Student
    (
    studId char(10) Primary key,
    Studname char(8) not null Unique nonclustered,
    DeptID char(2) not null references Tb_Dept
    )
    create table tb_student
    (
    studID char(10) Primary key,
    Studname char(8) not null,
    deptid char(2) not null references tb_dept,
    constraint Uk_Stuname Unique(Stuname)
    )
    14、--创建表结束后,添加、删除Unique约束
    --添加Unique约束
    alter table tb_Student ADD Constraint Uk_Depname Unique(Deptname)
    15、--删除unique约束
    Alter table tb_student Drop Constraint uk_Depname
    16、--创建默认值约束
    Create table tb_student
    (
    stuId char(10) Primary key,
    stuName char(8) not null,
    DeptID char(2) Not null references tb_Dept,
    sex char(2) not null default &#39M',
    Birthday smalldatetime not null default getdate()
    )
    17、--添加默认值约束
    alter table tb_student ADD constraint DEF_sex default &#39M' for sex
    18、--删除默认值约束
    alter table tb_student Drop Constraint DEF_Sex
    19、--创建表时,创建check约束
    create table tb_student
    (
    StudId char(10) Primary key,
    Studname char(8) not null,
    DeptId char(2) not null references tb_Dept,
    sex char(2) not null default &#39M' check(sex in (&#39M',&#39F')),
    zipcode char(6) not null check (Zipcode like '[0-9][0-9][0-9][0-9][0-9][0-9]' ),
    constraint ck_StudID Check (StudId like &#39S[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')
    )
    20、--check约束的其他例子
    check(coursescore >= 0 and coursescore < = 100)
    check(empld like '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' or empld like '[A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]')
    check(telno in (?',?',?',?',?') or telno like ?[0-9][0-9]')
    check(salary between 3000 and 10000)
    check(is_manager = 1 and sex = &#39F')
    check(case when is_manager<> 1 and sex = &#39F') Then 1 Else 0 End = 0
    21、--添加check约束
    alter table tb_student with nocheck ADD Constraint ck_Sex check(sex in (&#39M',&#39F'))
    22、--删除check约束
    alter table tb_student Drop constraint ck_sex

    数据完整性总结
    1、--Primary key 约束
    --非聚集索引不超过个,聚集索引最多个
    --primary key未指定索引,索引类型与Unique相同
    --Primary key的所有列必须非空not null
    2、--Unique约束
    --默认使用nonclustered
    --每个Unique都生成一个索引,非聚集索引不超过,聚集索引最多个
    3、--Foreign key
    --Foreign key列输入非空值,该值必须在被引用列中存在
    --Foreign key约束仅能引用同一服务器的数据库表,跨数据库的引用必须通过触发器实现
    --列级的Foreign key约束的references子句只能列出一个引用列,且数据类型必须相同
    --表级Foreign key约束的references子句引用列的数目必须与约束列的列数相同,没个列的数据类型必须相同
    --类型为timestamp的列是外键、被引用键的部分,不能指定cascade、set Null、set default
    --临时表不强制Foreign key约束
    --Foreign key只能引用所引用的表的Primary key或unique 约束中的列,或引用的表上的Unique Index中的列
    4、--Default定义
    --每列只能有一个Default定义
    --Default定义可以包含常量值,函数,或Null
    --不能对类型为timestamp的列,或自增长型的列,创建Default定义
    5、--Check约束
    --列级Check约束只能引用被约束的列,表级Check约束只能引用同一表中的列
    --不能在text、ntext、或image列上定义check约束
    6、--其他约束相关信息
    --为约束创建的索引不能用Drop Index删除,必须用Alter table删除约束
    --如果某个表有约束以及触发器,则将在触发器执行前先检查约束条件
    --若要获得关于表及其列的报表,请使用sp_help或sp_helpconstraint表名
    --若要获得与表相关的视图和存储过程的报表,请使用sp_depends
    --若列为计算列,是否为空由系统确定。使用带AllowsNull属性的ColumnProperty函数

  • 相关阅读:
    iSCSI又称为IPSAN
    文档类型定义DTD
    HDU 2971 Tower
    HDU 1588 Gauss Fibonacci
    URAL 1005 Stone Pile
    URAL 1003 Parity
    URAL 1002 Phone Numbers
    URAL 1007 Code Words
    HDU 3306 Another kind of Fibonacci
    FZU 1683 纪念SlingShot
  • 原文地址:https://www.cnblogs.com/1219zy/p/8071981.html
Copyright © 2011-2022 走看看