• SQLServer第六章:表【约束】


    约束是给表设置一些条件,必须满足这些条件才能成立。

    语法:

    --添加表约束:add constraint 取约束名 增加的约束类型(列名)
    --删除表约束:alter table 表名 drop constraint 约束名

    --取约束名规则:约束类型大写字母_表名_字段名  , 如:主键约束名:PK_Info_id

    主键约束:

    --创建一个表一个字段Test4做演示
    create table Info( Test4 int not null )
    --添加主键约束:alter table 表格名称 add primary key(列名)
    altertable Info add constraint pk primarykey(Test4)  --constraint 取约束名,不然数据库会随机取名,因为在SQLserver数据库只能通过约束名删除主键约束。
    --删除主键约束:在SQLserver不能使用【alter table 表名 drop primary key】来删除主键,只能用标准的删除约束名删除。不过在MySQL可以使用。
    altertable Info drop constraint pk

    查询主键约束名:

    SELECT
      tab.name AS [表名],
      idx.name AS [主键名称],
      col.name AS [主键列名]
    FROM
      sys.indexes idx
        JOIN sys.index_columns idxCol
          ON (idx.object_id = idxCol.object_id
              AND idx.index_id = idxCol.index_id
              AND idx.is_primary_key = 1)
        JOIN sys.tables tab
          ON (idx.object_id = tab.object_id)
        JOIN sys.columns col
          ON (idx.object_id = col.object_id
              AND idxCol.column_id = col.column_id);

    外键约束:foreign key

      外键其实就是引用,因为主键实现了实体的完整性,外键实现了引用的完整性,应用完整性规定,所引用的数据必须存在!说白了就是将两个表关联起来
      比如B表存在一个字段b,有外键约束,引用于A表的主键a,那么在向B表插入数据时,字段b必须为A表中a已经存在的值,如过向b中存放一个a中没有的值,则会报违反外键约束。
    语法:alter table 表名 add constraint 约束名FK foreign key(列名) references 被引用的表名称(列名)

    外键约束注意:

    --添加数据:先添加主表数据,在添加从表数据。
    --删除数据:先删除从表数据,在删除主表数据。

    创建两个表做演示,注意:先执行约束,在添加数据

    create database NetBarDB    --创建数据库create database 数据库名
    go    --批处理(批量处理)
    use NetBarDB                --打开数据库
    go
    
    --创建表也是一样有同名的表,需要删除才能创建,可是有点表添加了外键约束无法删除,所以删除表时有时候需要,查询当前表外键约束来源。需要删除外键约束才能删除表。
    select FK.name as 外键约束名,FK.object_id,object_name(FK.parent_object_id) as 设置约束的表名 --查询三个字段外键的键名,id ,约束表名:指被哪个表设置了外键约束。
    from sys.foreign_keys as FK 
    join sys.objects as O on FK.referenced_object_id=O.object_id
    where O.name = 'cardInfo'  --cardInfo是取的表名,指需要查询的表名,查被哪些表设置了外键约束,好方便删除外键约束。才能删除表
    
    --exists【存在】 查询到表  用dbo.sysobjects来索引表
    if exists(select * from sys.objects where name='Info')
        begin
            --alter table recordInfo drop constraint FK__recordInfo__PCId__573DED66; --这里删除约束是因为存在外链约束,复制约束名过来,删除外键约束才能删除表。
            drop table Info    --删除表:drop table 表名
        end
    
    create table cardInfo
    (
        cardId int primary key identity,
        cardPassword varchar(20) not null ,
        min_salary money not null check(min_salary>=100),--money【钱】可做类型 最低薪资 check约束 不小于100元    
        transactTime datetime default getDate() not null,--datetime时间类型,default默认 getdate()当前时间
        stuaddress text --text文本类型
    )
    
    create table PCInfo    
    (
        PCId int primary key identity,    -- 主键约束:primary key 主键 identity(1,1) 自增不写括号数字默认1,1;意思是1开始后面的每个加1;
        PCUse char(10) not null unique ,   --int整数类型;unique唯一约束:意思是值不能重复。非空约束:not null不为空;加起来相当于主键约束
        pcsex char(10) not null check(pcsex='' or pcsex=''),--条件约束check其中,or【或】的意思,and【和】与的意思
        PCNote varchar(50) default '这个是默认值',-- 默认值约束:default 设定默认值;
        PCScore int not null references cardInfo(cardId),--外键,引用cardInfo表,cardId列 
        --primary key (PCId) --设置主键,不太喜欢这种写法,可以直接写字段里。
        --foreign key (PCScore) references cardInfo(cardId)--这种也是给PCScore设置外键约束,对象为cardInfo(cardId)
    )
    
    insert into cardInfo values('123456',156,getDate(),default),('123abc',800,default,'东南西北'),('abc123',800,'2001-01-01','山的那一边')
    insert into PCInfo values('张三','',null,2),('李四','','',3),('王五','',default,1)
    
    select * from PCInfo
    select * from cardInfo

    check:条件约束

    就是给一列的数据进行了【限制】:alter table 表名 add constraint 随便取约束名 check(限制条件)

    语法:
    alter table <表名> add constraint <约束名> check( <列名> is [ null | not null ])--限制列可以为空或非空

    alter table cardInfo add constraint CK_cardInfo_cardPassword check(len(cardPassword)>=6);--check【审查】(限制长度必须大于等于6个字符)

    unique唯一约束:不能有重复值

    给某个表某一列添加个【唯一】约束,也就是不能有重复数据

    语法:
    alter table 表名 add constraint 约束名称 unique(列名)

    alter table cardInfo add constraint UQ_pw unique(cardPassword); --这个字段不能有重复值

    default:默认值约束

    给某个表某一列添加个【默认值】数据

    语法:
    alter table 表名 add constraint 约束名称 default  默认值 for 列名

    alter table cardInfo add constraint DF_stuaddress default '地址不详' for stuaddress; --给表cardInfo,字段stuaddress设置默认值为 '地址不详'。

    删除约束统一语法:alter table 表名 drop constraint 约束名

    为了更好的查询约束名,提供了一些查询语句

    查询唯一约束:unique

    SELECT
      tab.name AS [表名],
      idx.name AS [约束名称],
      col.name AS [约束列名]
    FROM
      sys.indexes idx
        JOIN sys.index_columns idxCol
          ON (idx.object_id = idxCol.object_id
              AND idx.index_id = idxCol.index_id
              AND idx.is_unique_constraint = 1)
        JOIN sys.tables tab
          ON (idx.object_id = tab.object_id)
        JOIN sys.columns col
          ON (idx.object_id = col.object_id
              AND idxCol.column_id = col.column_id);

    查询条件约束:check

    SELECT
      tab.name AS [表名],
      chk.name AS [Check约束名],
      col.name AS [列名],
      chk.definition
    FROM
      sys.check_constraints chk
        JOIN sys.tables tab
          ON (chk.parent_object_id = tab.object_id)
        JOIN sys.columns col
          ON (chk.parent_object_id = col.object_id
              AND chk.parent_column_id = col.column_id)

    查询外键约束:

    select
      oSub.name  AS  [子表名称],
      fk.name AS  [外键名称],
      SubCol.name AS [子表列名],
      oMain.name  AS  [主表名称],
      MainCol.name AS [主表列名]
    from
      sys.foreign_keys fk 
        JOIN sys.all_objects oSub 
            ON (fk.parent_object_id = oSub.object_id)
        JOIN sys.all_objects oMain
            ON (fk.referenced_object_id = oMain.object_id)
        JOIN sys.foreign_key_columns fkCols
            ON (fk.object_id = fkCols.constraint_object_id)
        JOIN sys.columns SubCol
            ON (oSub.object_id = SubCol.object_id 
                AND fkCols.parent_column_id = SubCol.column_id)
        JOIN sys.columns MainCol
            ON (oMain.object_id = MainCol.object_id 
                AND fkCols.referenced_column_id = MainCol.column_id)
  • 相关阅读:
    python-pyStrich条形码模块
    js原型及原型链解析
    解决Genymotion下载device时较慢的问题
    nodejs实现OAuth2.0授权服务
    Swagger文档添加file上传参数写法
    TypeScript学习笔记之类
    TypeScript学习笔记之接口类型
    win64环境下使用curl命令
    TypeScript学习笔记之基础类型
    WebRTC介绍及简单应用
  • 原文地址:https://www.cnblogs.com/longxinyv/p/16702758.html
Copyright © 2020-2023  润新知