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

    主键(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函数

  • 相关阅读:
    C#通过正则表达式统计词频的一个方法
    本地服务器远程连接其它数据库
    拼字符串成为时间,和两个计算时间点的中间值
    删除文件夹里的图片,打印删除日志
    行转列SQL语句
    加载出一个有层次的下拉框
    查询结果列传行
    【Java&Python双管齐下复健002】回文数和反转数
    【Java&Python双管齐下复健001】冒泡排序和质数判断
    【LeetCode记录】初级算法:数组之删除排序数组中的重复项
  • 原文地址:https://www.cnblogs.com/maoxiuying/p/9098422.html
Copyright © 2011-2022 走看看