constraint_constraintlayout - CSDN
  • constraint用法总结

    2017-12-31 16:44:40
    主要就是增加约束的 以下几种约束 、并 一一列举: 1.主键约束: 要对一个列加主键约束的话,这列就必须要满足的条件...alter table 表格名称 add constraint 约束名称 增加的约束类型 (列名) 例子: a
    主要就是增加约束的

    以下几种约束 、并 一一列举:

    1.主键约束:
    要对一个列加主键约束的话,这列就必须要满足的条件就是分空
    因为主键约束:就是对一个列进行了约束,约束为(非空、不重复)
    以下是代码  要对一个列加主键,列名为id,表名为emp

    格式为:
    alter table 表格名称 add constraint 约束名称 增加的约束类型 (列名)

    例子:
    alter table emp add constraint ppp primary key (id)

    ————————————————————————————————

    2.check约束:
    就是给一列的数据进行了限制
    比方说,年龄列的数据都要大于20的
    表名(emp) 列名(age)

    格式:
    alter table 表名称 add constraint 约束名称 增加的约束类型 (列名)

    例子:
    alter table emp add constraint xxx check(age>20)

    ______________________________________________________________________

    3.unique约束:
    这样的约束就是给列的数据追加的不重复的约束类型

    格式:
    alter table 表名 add constraint 约束名称 约束类型(列名)
    比方说可以给ename列加个unique,让ename列的数据不重复
    例子:
    alter table emp add constraint qwe unique(ename)

    ————————————————————————————————

    4.默认约束:
    意思很简单就是让此列的数据默认为一定的数据

    格式:
    alter table 表名称 add constraint 约束名称 约束类型 默认值) for 列名

    比方说:emp表中的gongzi列默认为10000

    alter table emp add constraint jfsd default 10000 for gongzi


    ————————————————————————————————

    5.外键约束:
    这个有点难理解了,外键其实就是引用
    因为主键实现了实体的完整性,
    外键实现了引用的完整性,
    应用完整性规定,所引用的数据必须存在!

    其实就是个引用,
    比方说一个表名称叫dept 里面有2列数据 一列是ID一列是ENAME
    id:表示产品的编号
    ename:表示产品的名称

    另外一个表格名称是emp 里面有2列数据,一列是ID 一列是DID
    id:表示用户号
    did:表示购买的产品号

    要让emp表中的did列去引用dept表中的id

    可以用下面的方法

    格式:
    alter table 表名 add constraint 约束名称 约束类型 (列名) references 被引用的表名称 (列名)

    例子:
    alter table emp add constraint jfkdsj foreign key (did) references dept (id)
    展开全文
  • SQL中的CONSTRAINT用法总结

    千次阅读 2019-05-08 17:08:46
    主要就是增加数据约束的。 Oracle中的约束简单介绍 约束   Including Constraints  ... 在数据库中使用约束(constraints)是为了在该数据库中实施所谓的"业务规则"其实就是防止非法信息进入数据库,...



    主要就是增加数据约束的。


    Oracle中的约束简单介绍

    约束   Including Constraints

        在数据库中使用约束(constraints)是为了在该数据库中实施所谓的"业务规则"其实就是防止非法信息进入数据库,满足管理员和应用开发人员所定义的规则集.

        ORACLE使用完整性约束(integrity constraints)防止不合法的数据写入数据库,管理员和开发人员可以定义完整性规则,增强商业规则,限制数据表中的数据.如果一个DML语句执行的任何结果破坏了完整性约束,ORACLE就会回滚语句,返回错误信息.

        约束是通过使用CREATE TABLE或ALTER TABLE语句生成的.(建立表时或者表建立后修改都可)如果相关的约束定义在单列上,可以在列这一级指定约束的定义;多列约束必须定义在数据表级,相关的列要在括号中指定,用逗号分隔.如果没有为约束提供一个名字,那么ORACLE会分配一个系统生成的唯一名字,以SYS_开头,你可以使用关键字CONSTRAINTS后面跟随相关的约束名字来为约束指定名字.

    ORACLE支持五种类型的完整性约束
    NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值.
    CHECK (检查)--检查在约束中指定的条件是否得到了满足.
    UNIQUE (唯一)--保证在指定的列中没有重复值.在该表中每一个值或者每一组值都将是唯一的.
    PRIMARY KEY (主键)--用来唯一的标识出表的每一行,并且防止出现NULL值,一个表只能有一个主键约束.
    POREIGN KEY (外部键)--通过使用公共列在表之间建立一种父子(parent-child)关系,在表上定义的外部键可以指向主键或者其他表的唯一键.



    以下几种约束 、并 一一列举:

    1.主键约束:
    要对一个列加主键约束的话,这列就必须要满足的条件就是分空
    因为主键约束:就是对一个列进行了约束,约束为(非空、不重复)
    以下是代码  要对一个列加主键,列名为id,表名为emp

    格式为:
    alter table 表格名称 add constraint 约束名称 增加的约束类型 (列名)

    例子:
    alter table emp add constraint ppp primary key (id)

    ————————————————————————————————

    2.check约束:
    就是给一列的数据进行了限制
    比方说,年龄列的数据都要大于20的
    表名(emp) 列名(age)

    格式:
    alter table 表名称 add constraint 约束名称 增加的约束类型 (列名)

    例子:
    alter table emp add constraint xxx check(age>20)

    ______________________________________________________________________

    3.unique约束:
    这样的约束就是给列的数据追加的不重复的约束类型

    格式:
    alter table 表名 add constraint 约束名称 约束类型(列名)
    比方说可以给ename列加个unique,让ename列的数据不重复
    例子:
    alter table emp add constraint qwe unique(ename)

    ————————————————————————————————

    4.默认约束:
    意思很简单就是让此列的数据默认为一定的数据

    格式:
    alter table 表名称 add constraint 约束名称 约束类型 默认值) for 列名

    比方说:emp表中的gongzi列默认为10000

    alter table emp add constraint jfsd default 10000 for gongzi


    ————————————————————————————————

    5.外键约束:
    这个有点难理解了,外键其实就是引用
    因为主键实现了实体的完整性,
    外键实现了引用的完整性,
    应用完整性规定,所引用的数据必须存在!

    其实就是个引用,
    比方说一个表名称叫dept 里面有2列数据 一列是ID一列是ENAME
    id:表示产品的编号
    ename:表示产品的名称

    另外一个表格名称是emp 里面有2列数据,一列是ID 一列是DID
    id:表示用户号
    did:表示购买的产品号

    要让emp表中的did列去引用dept表中的id

    可以用下面的方法

    格式:
    alter table 表名 add constraint 约束名称 约束类型 (列名) references 被引用的表名称 (列名)

    例子:

    alter table emp add constraint jfkdsj foreign key (did) references dept (id)





    约束定义存储在数据字典中,查询USER_CONSTRAINTS可以获得相关信息.


    定义约束
    CREATE TABLE [schema.]table
                      (column datatype [DEFAULT expr]
                      [column_constraint],
                          ...
                      [table_constraint][,...]);
    e.g.
    CREATE TABLE employees
                      (employee_id NUMBER(6),
                          first_name     VARCHAR2(20),
                          ...
                          job_id           VARCHAR2(10) NOT NULL,
                          CONSTRAINTS emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID));
    列级的约束定义
    column [CONSTRAINT constraint_name] constraint_type,
    表级约束的定义
    column,..
    [CONSTRAINT constraint_name] constraint_type (column,...)

    NOT NULL约束
    只能定义在列级,不能定义在表级.
    e.g.
    CREATE TABLE employees
                      (employee_id NUMBER(6),
                          last_name     VARCHAR2(25) NOT NULL, //没有指定名字,将用系统SYS_命名
                          salary          NUMBER(8,2),
                          commission_pct NUMBER(2,2),
                          hire_date    DATE CONSTRAINT emp_hire_date_nn NOT NULL);   //用户定义了名字

    UNIQUE约束
    用来保护一个表中的一个或者多个列没有任何两行在收到保护的列中具有重复的数据.ORACLE在唯一键列上自动生成一个唯一索引以实现唯一性
    e.g.
    CREATE TABLE employees
                      (employee_id NUMBER(6),
                          last_name     VARCHAR2(25) NOT NULL, 
                          salary          NUMBER(8,2),
                          commission_pct NUMBER(2,2),
                          hire_date DATE NOT NULL,
                          CONSTRAINT emp_email_uk UNIQUE(email));

    PRIMARY KEY约束
    唯一键的所有特征都适用于主键约束,只是在主键列中不允许有NULL值.一个表只能有一个主键.
    e.g.
    CREATE TABLE departments
                      (department_id NUMBER(4),
                          department_name VARCHAR2(30) CONSTRAINT dept_name_nn NOT NULL,
                          manager_id       NUMBER(6),
                          location_id           NUMBER(4),
                          CONSTRAINT dept_id_pk PRIMARY KEY(department_id));

    FOREIGN KEY 约束
    用来保护一个表中的一个或者多个列,它会通过一个主键主键或者唯一键保证对于每个非NULL值在数据库的其他地方都有一个数据可用.这个外部键就是在生成此约束的表(子表)中的一个或多个列,在父级表和子表中,相关列的数据类型必须匹配.外部键列和引用键(reference key)列可以位于相同的表中(自引用完整性约束).
    e.g.
    CREATE TABLE employees
                      (employee_id NUMBER(6),
                          last_name     VARCHAR2(25) NOT NULL, 
                          salary          NUMBER(8,2),
                          commission_pct NUMBER(2,2),
                          hire_date DATE NOT NULL,
                          deparment_id NUMBER(4),
                          CONSTRAINT emp_dept_fk FOREIGN KEY(department_id) REFERENCES departments(department_id),
                          CONSTRAINT emp_email_uk UNIQUE(email));

    上例中是在表级定义外部键约束,如果在列级定义,不同的是:
    CREATE TABLE employees
                      (...,
                          department_id NUMBER(4) CONSTRAINT emp_deptid_fk REFERENCES departments(department_id),
                      ...);
                       //没有关键字FOREIGN KEY
    FOREIGN KEY约束还有两个关键字是
    ON DELETE CASCADE --当删除所引用的父表记录时,删除子表中相关的记录
    ON DELETE SET NULL--与上面不同的是删除时,转换子表中相关记录为NULL值
    默认情况下,如果没有指定以上两个中任一,则父表中被引用的记录将不能被删除.

    CHECK 约束
    [CONSTRAINT <constraint name>] CHECK (<condition>
    这里CHECK子句中的CONDITION应该求值为一个布尔值结果,并且可以引用相同行中其他列的值;不能包含子查询,序列,环境函数(SYSDATE,UID,USER,USERENV)和伪列(ROWNUM,LEVEL,CURRVAL,NEXTVAL),一个列上可以定义多个CHECK约束,如果所定义的条件为FALSE,则语句将回滚.
    CREATE TABLE employees
                      (...,
                          salary NUMBER(8,2) CONSTRAINT emp_salary_min CHECK (salary>0),
                          ...);



    添加约束
    ALTER TABLE employees
    ADD CONSTRAINT emp_manager_fk FOREIGN KEY(manager_id) REFERENCES employees(employee_id);
    删除约束
    ALTER TABLE employees
    DROP CONSTRAINT emp_manager_fk;
    ALTER TABLE departments
    DROP PRIMARY KEY CASCADE; //由于departments被employees.department_id引用了
    对于NOT NULL约束,用ALTER TABLE MODIFY子句来删除
    ALTER TABLE employees MODIFY last_name NULL;
    关闭约束
    ALTER TABLE employees
    DISABLE CONSTRAINT emp_emp_id_pk CASCADE;   //如果没有被引用则不需CASCADE关键字
    当你生成一个约束时,约束自动打开(除非你指定了DISABLE子句0,当用DISABLE关闭UNIQUE或者PRIMARY KEY约束时,ORACLE会自动删除相关的唯一索引,再次打开时,ORACLE又会自动建立的.
    打开约束
    ALTER TABLE employees
    ENABLE CONSTRAINT emp_emp_id_pk; //注意,打开一个先前关闭的被引用的主键约束,并不能自动打开相关的外部键约束

    可以从USER_CONSTRAINTS表和USER_CONS_COLUMNS视图中查询约束的信息
    SELECT constraint_name,constraint_type,search_condition
    FROM user_constraints
    WHERE   table_name='EMPLOYEES';

    约束类型
    C--CHECK和NOT NULL都算为C TYPE
    P--PRIMARY KEY
    R--REFERENTIAL INTEGRITY就是外部键约束
    U--UNIQUE

    SELECT constraint_name,column_name
    FROM user_cons_columns

    WHERE   table_name='EMPLOYEES';

    主要就是增加数据约束的。


    Oracle中的约束简单介绍

    约束   Including Constraints

        在数据库中使用约束(constraints)是为了在该数据库中实施所谓的"业务规则"其实就是防止非法信息进入数据库,满足管理员和应用开发人员所定义的规则集.

        ORACLE使用完整性约束(integrity constraints)防止不合法的数据写入数据库,管理员和开发人员可以定义完整性规则,增强商业规则,限制数据表中的数据.如果一个DML语句执行的任何结果破坏了完整性约束,ORACLE就会回滚语句,返回错误信息.

        约束是通过使用CREATE TABLE或ALTER TABLE语句生成的.(建立表时或者表建立后修改都可)如果相关的约束定义在单列上,可以在列这一级指定约束的定义;多列约束必须定义在数据表级,相关的列要在括号中指定,用逗号分隔.如果没有为约束提供一个名字,那么ORACLE会分配一个系统生成的唯一名字,以SYS_开头,你可以使用关键字CONSTRAINTS后面跟随相关的约束名字来为约束指定名字.

    ORACLE支持五种类型的完整性约束
    NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值.
    CHECK (检查)--检查在约束中指定的条件是否得到了满足.
    UNIQUE (唯一)--保证在指定的列中没有重复值.在该表中每一个值或者每一组值都将是唯一的.
    PRIMARY KEY (主键)--用来唯一的标识出表的每一行,并且防止出现NULL值,一个表只能有一个主键约束.
    POREIGN KEY (外部键)--通过使用公共列在表之间建立一种父子(parent-child)关系,在表上定义的外部键可以指向主键或者其他表的唯一键.



    以下几种约束 、并 一一列举:

    1.主键约束:
    要对一个列加主键约束的话,这列就必须要满足的条件就是分空
    因为主键约束:就是对一个列进行了约束,约束为(非空、不重复)
    以下是代码  要对一个列加主键,列名为id,表名为emp

    格式为:
    alter table 表格名称 add constraint 约束名称 增加的约束类型 (列名)

    例子:
    alter table emp add constraint ppp primary key (id)

    ————————————————————————————————

    2.check约束:
    就是给一列的数据进行了限制
    比方说,年龄列的数据都要大于20的
    表名(emp) 列名(age)

    格式:
    alter table 表名称 add constraint 约束名称 增加的约束类型 (列名)

    例子:
    alter table emp add constraint xxx check(age>20)

    ______________________________________________________________________

    3.unique约束:
    这样的约束就是给列的数据追加的不重复的约束类型

    格式:
    alter table 表名 add constraint 约束名称 约束类型(列名)
    比方说可以给ename列加个unique,让ename列的数据不重复
    例子:
    alter table emp add constraint qwe unique(ename)

    ————————————————————————————————

    4.默认约束:
    意思很简单就是让此列的数据默认为一定的数据

    格式:
    alter table 表名称 add constraint 约束名称 约束类型 默认值) for 列名

    比方说:emp表中的gongzi列默认为10000

    alter table emp add constraint jfsd default 10000 for gongzi


    ————————————————————————————————

    5.外键约束:
    这个有点难理解了,外键其实就是引用
    因为主键实现了实体的完整性,
    外键实现了引用的完整性,
    应用完整性规定,所引用的数据必须存在!

    其实就是个引用,
    比方说一个表名称叫dept 里面有2列数据 一列是ID一列是ENAME
    id:表示产品的编号
    ename:表示产品的名称

    另外一个表格名称是emp 里面有2列数据,一列是ID 一列是DID
    id:表示用户号
    did:表示购买的产品号

    要让emp表中的did列去引用dept表中的id

    可以用下面的方法

    格式:
    alter table 表名 add constraint 约束名称 约束类型 (列名) references 被引用的表名称 (列名)

    例子:

    alter table emp add constraint jfkdsj foreign key (did) references dept (id)





    约束定义存储在数据字典中,查询USER_CONSTRAINTS可以获得相关信息.


    定义约束
    CREATE TABLE [schema.]table
                      (column datatype [DEFAULT expr]
                      [column_constraint],
                          ...
                      [table_constraint][,...]);
    e.g.
    CREATE TABLE employees
                      (employee_id NUMBER(6),
                          first_name     VARCHAR2(20),
                          ...
                          job_id           VARCHAR2(10) NOT NULL,
                          CONSTRAINTS emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID));
    列级的约束定义
    column [CONSTRAINT constraint_name] constraint_type,
    表级约束的定义
    column,..
    [CONSTRAINT constraint_name] constraint_type (column,...)

    NOT NULL约束
    只能定义在列级,不能定义在表级.
    e.g.
    CREATE TABLE employees
                      (employee_id NUMBER(6),
                          last_name     VARCHAR2(25) NOT NULL, //没有指定名字,将用系统SYS_命名
                          salary          NUMBER(8,2),
                          commission_pct NUMBER(2,2),
                          hire_date    DATE CONSTRAINT emp_hire_date_nn NOT NULL);   //用户定义了名字

    UNIQUE约束
    用来保护一个表中的一个或者多个列没有任何两行在收到保护的列中具有重复的数据.ORACLE在唯一键列上自动生成一个唯一索引以实现唯一性
    e.g.
    CREATE TABLE employees
                      (employee_id NUMBER(6),
                          last_name     VARCHAR2(25) NOT NULL, 
                          salary          NUMBER(8,2),
                          commission_pct NUMBER(2,2),
                          hire_date DATE NOT NULL,
                          CONSTRAINT emp_email_uk UNIQUE(email));

    PRIMARY KEY约束
    唯一键的所有特征都适用于主键约束,只是在主键列中不允许有NULL值.一个表只能有一个主键.
    e.g.
    CREATE TABLE departments
                      (department_id NUMBER(4),
                          department_name VARCHAR2(30) CONSTRAINT dept_name_nn NOT NULL,
                          manager_id       NUMBER(6),
                          location_id           NUMBER(4),
                          CONSTRAINT dept_id_pk PRIMARY KEY(department_id));

    FOREIGN KEY 约束
    用来保护一个表中的一个或者多个列,它会通过一个主键主键或者唯一键保证对于每个非NULL值在数据库的其他地方都有一个数据可用.这个外部键就是在生成此约束的表(子表)中的一个或多个列,在父级表和子表中,相关列的数据类型必须匹配.外部键列和引用键(reference key)列可以位于相同的表中(自引用完整性约束).
    e.g.
    CREATE TABLE employees
                      (employee_id NUMBER(6),
                          last_name     VARCHAR2(25) NOT NULL, 
                          salary          NUMBER(8,2),
                          commission_pct NUMBER(2,2),
                          hire_date DATE NOT NULL,
                          deparment_id NUMBER(4),
                          CONSTRAINT emp_dept_fk FOREIGN KEY(department_id) REFERENCES departments(department_id),
                          CONSTRAINT emp_email_uk UNIQUE(email));

    上例中是在表级定义外部键约束,如果在列级定义,不同的是:
    CREATE TABLE employees
                      (...,
                          department_id NUMBER(4) CONSTRAINT emp_deptid_fk REFERENCES departments(department_id),
                      ...);
                       //没有关键字FOREIGN KEY
    FOREIGN KEY约束还有两个关键字是
    ON DELETE CASCADE --当删除所引用的父表记录时,删除子表中相关的记录
    ON DELETE SET NULL--与上面不同的是删除时,转换子表中相关记录为NULL值
    默认情况下,如果没有指定以上两个中任一,则父表中被引用的记录将不能被删除.

    CHECK 约束
    [CONSTRAINT <constraint name>] CHECK (<condition>
    这里CHECK子句中的CONDITION应该求值为一个布尔值结果,并且可以引用相同行中其他列的值;不能包含子查询,序列,环境函数(SYSDATE,UID,USER,USERENV)和伪列(ROWNUM,LEVEL,CURRVAL,NEXTVAL),一个列上可以定义多个CHECK约束,如果所定义的条件为FALSE,则语句将回滚.
    CREATE TABLE employees
                      (...,
                          salary NUMBER(8,2) CONSTRAINT emp_salary_min CHECK (salary>0),
                          ...);



    添加约束
    ALTER TABLE employees
    ADD CONSTRAINT emp_manager_fk FOREIGN KEY(manager_id) REFERENCES employees(employee_id);
    删除约束
    ALTER TABLE employees
    DROP CONSTRAINT emp_manager_fk;
    ALTER TABLE departments
    DROP PRIMARY KEY CASCADE; //由于departments被employees.department_id引用了
    对于NOT NULL约束,用ALTER TABLE MODIFY子句来删除
    ALTER TABLE employees MODIFY last_name NULL;
    关闭约束
    ALTER TABLE employees
    DISABLE CONSTRAINT emp_emp_id_pk CASCADE;   //如果没有被引用则不需CASCADE关键字
    当你生成一个约束时,约束自动打开(除非你指定了DISABLE子句0,当用DISABLE关闭UNIQUE或者PRIMARY KEY约束时,ORACLE会自动删除相关的唯一索引,再次打开时,ORACLE又会自动建立的.
    打开约束
    ALTER TABLE employees
    ENABLE CONSTRAINT emp_emp_id_pk; //注意,打开一个先前关闭的被引用的主键约束,并不能自动打开相关的外部键约束

    可以从USER_CONSTRAINTS表和USER_CONS_COLUMNS视图中查询约束的信息
    SELECT constraint_name,constraint_type,search_condition
    FROM user_constraints
    WHERE   table_name='EMPLOYEES';

    约束类型
    C--CHECK和NOT NULL都算为C TYPE
    P--PRIMARY KEY
    R--REFERENTIAL INTEGRITY就是外部键约束
    U--UNIQUE

    SELECT constraint_name,column_name
    FROM user_cons_columns

    WHERE   table_name='EMPLOYEES';

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

    万次阅读 多人点赞 2018-03-22 15:40:04
    约束英文:constraint 约束实际上就是表中数据的限制条件 二、约束作用 表在设计的时候加入约束的目的就是为了保证表中的记录完整和有效 比如name字段中要让其用户名不重复,这就需要添加约束。或者...

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

    一、什么是约束

    约束英文: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 |
    +-----+-------+---------+-----+--------------+
    

    结论

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

    展开全文
  • Android新特性介绍,ConstraintLayout完全解析

    万次阅读 多人点赞 2017-05-11 16:07:51
    今天给大家带来2017年的第一篇文章,这里先祝大家新年好。 本篇文章的主题是ConstraintLayout。其实ConstraintLayout是Android Studio 2.2中主要的新增功能之一,也是Google在去年的I/O大会上重点宣传的一个功能。...

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/53122387

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每天都有文章更新。

    今天给大家带来2017年的第一篇文章,这里先祝大家新年好。

    本篇文章的主题是ConstraintLayout。其实ConstraintLayout是Android Studio 2.2中主要的新增功能之一,也是Google在去年的I/O大会上重点宣传的一个功能。我们都知道,在传统的Android开发当中,界面基本都是靠编写XML代码完成的,虽然Android Studio也支持可视化的方式来编写界面,但是操作起来并不方便,我也一直都不推荐使用可视化的方式来编写Android应用程序的界面。

    而ConstraintLayout就是为了解决这一现状而出现的。它和传统编写界面的方式恰恰相反,ConstraintLayout非常适合使用可视化的方式来编写界面,但并不太适合使用XML的方式来进行编写。当然,可视化操作的背后仍然还是使用的XML代码来实现的,只不过这些代码是由Android Studio根据我们的操作自动生成的。

    另外,ConstraintLayout还有一个优点,它可以有效地解决布局嵌套过多的问题。我们平时编写界面,复杂的布局总会伴随着多层的嵌套,而嵌套越多,程序的性能也就越差。ConstraintLayout则是使用约束的方式来指定各个控件的位置和关系的,它有点类似于RelativeLayout,但远比RelativeLayout要更强大。

    其实ConstraintLayout属于Android Studio 2.2的新特性,我在去年写《第二行代码》的时候就非常想要将这部分内容加入到新书里面,但是在尝试之后还是放弃了。因为ConstraintLayout的用法很多都是对控件进行拖拽,只用文字或者是一些静态图片实在太难将它的用法表达清楚了,因此不太适合写到书上。我当时的想法就是在博客上面写一篇ConstraintLayout的用法讲解,来弥补一下《第二行代码》中缺失的这部分新特性,那么今天这篇文章来了。

    开始

    下面我们开始用边学边练的方式来进行学习,首先打开你的Android Studio,并新建一个ConstraintLayoutTest项目。另外,确保你的Android Studio是2.2或以上版本。

    为了要使用ConstraintLayout,我们需要在app/build.gradle文件中添加ConstraintLayout的依赖,如下所示。

    dependencies {
        compile 'com.android.support.constraint:constraint-layout:1.0.0-beta4'
    }

    目前ConstraintLayout库最新的版本是1.0.0-beta4,还没有推出正式稳定版本,不过这并不影响我们提前进行学习和使用。

    现在打开res/layout/activity_main.xml文件,由于这是一个新建的空项目,Android Studio会自动帮我们创建好一个布局,如下图所示。

    不过,Android Studio自动创建的这个布局默认使用的是RelativeLayout,我们可以通过如下操作将它转换成ConstraintLayout。

    转换完成之后,原RelativeLayout中的内容也会自动转换到ConstraintLayout中,比如图中的TextView。如果你不需要它的话,可以选中这个控件,然后按键盘上的Delete键即可删除。

    我们可以看到,现在主操作区域内有两个类似于手机屏幕的界面,左边的是预览界面,右边的是蓝图界面。这两部分都可以用于进行布局编辑工作,区别是左边部分主要用于预览最终的界面效果,右边部分主要用于观察界面内各个控件的约束情况。

    基本操作

    下面我们来学习一些具体的操作吧,ConstraintLayout的基本用法很简单,比如我们想要向布局中添加一个按钮,那么只需要从左侧的Palette区域拖一个Button进去就可以了,如下图所示。

    虽说现在Button已经添加到界面上了,但是由于我们还没有给Button添加任何的约束,因此Button并不知道自己应该出现在什么位置。现在我们在预览界面上看到的Button位置并不是它最终运行后的实际位置,如果一个控件没有添加任何约束的话,它在运行之后会自动位于界面的左上角。

    那么下面我们就来给Button添加约束,每个控件的约束都分为垂直和水平两类,一共可以在四个方向上给控件添加约束,如下图所示。

    上图中Button的上下左右各有一个圆圈,这圆圈就是用来添加约束的,我们可以将约束添加到ConstraintLayout,也可以将约束添加到另一个控件。比如说,想让Button位于布局的右下角,就可以这样添加约束,如下图所示。

    我们给Button的右边和下边添加了约束,因此Button就会将自己定位到布局的右下角了。类似地,如果我们想要让Button居中显示,那么就需要给它的上下左右都添加约束,如下图所示。

    这就是添加约束最基本的用法了。

    除此之外,我们还可以使用约束让一个控件相对于另一个控件进行定位。比如说,我们希望再添加一个Button,让它位于第一个Button的正下方,并且间距64dp,那么操作如下所示。

    现在添加约束的方式我们已经学完了,那么该怎样删除约束呢?其实也很简单,删除约束的方式一共有三种,第一种用于删除一个单独的约束,将鼠标悬浮在某个约束的圆圈上,然后该圆圈会变成红色,这个时候单击一下就能删除了,如下图所示。

    第二种用于删除某一个控件的所有约束,选中一个控件,然后它的左下角会出现一个删除约束的图标,点击该图标就能删除当前控件的所有约束了,如下所示。

    第三种用于删除当前界面中的所有约束,点击工具栏中的删除约束图标即可,如下图所示。

    Inspector

    这样我们就把ConstraintLayout的基本用法学完了,接下来我们开始学习一些进阶的内容。

    当你选中任意一个控件的时候,在右侧的Properties区域就会出现很多的属性选项,如下图所示。

    在这里我们就可以设置当前控件的所有属性,如文本内容、颜色、点击事件等等。这些功能都非常简单,我就不再进行详细介绍,大家自己点一点就会操作了。

    需要我们重点掌握的是Properties区域的上半部分,这部分也被称为Inspector。

    首先可以看到,在Inspector中有一个纵向的轴和一个横向的轴,这两个轴也是用于确定控件的位置的。我们刚才给Button的上下左右各添加了一个约束,然后Button就能居中显示了,其实就是因为这里纵横轴的值都是50。如果调整了纵横轴的比例,那么Button的位置也会随之改变,如下图所示。

    不过,虽然我们将横轴的值拖动到了100,但是Button并没有紧贴到布局的最右侧,这是为什么呢?实际上,Android Studio给控件的每个方向上的约束都默认添加了一个16dp的间距,从Inspector上面也可以明显地看出来这些间距的值。如果这些默认值并不是你想要的,可以直接在Inspector上进行修改,如下图所示:

    可以看到,修改成0之后Button右侧的间距就没了。

    接下来我们再来学习一下位于Inspector最中间的那个正方形区域,它是用来控制控件大小的。一共有三种模式可选,每种模式都使用了一种不同的符号表示,点击符号即可进行切换。

    • 表示wrap content,这个我们很熟悉了,不需要进行什么解释。
    • 表示固定值,也就是给控件指定了一个固定的长度或者宽度值。
    • 表示any size,它有点类似于match parent,但和match parent并不一样,是属于ConstraintLayout中特有的一种大小控制方式,下面我们来重点讲解一下。

    首先需要说明,在ConstraintLayout中是有match parent的,只不过用的比较少,因为ConstraintLayout的一大特点就是为了解决布局嵌套,既然没有了布局嵌套,那么match parent也就没有多大意义了。

    而any size就是用于在ConstraintLayout中顶替match parent的,先看一下我们怎样使用any size实现和match parent同样的效果吧。比如说我想让Button的宽度充满整个布局,操作如下图所示。

    可以看到,我们将Button的宽度指定成any size,它就会自动充满整个布局了。当然还要记得将Button左侧的间距设置成0才行。

    那有的朋友可能会问了,这和match parent有什么区别呢?其实最大的区别在于,match parent是用于填充满当前控件的父布局,而any size是用于填充满当前控件的约束规则。举个例子更好理解,如果我们有一个新的Button,它的其中一个约束是添加到当前这个Button上的,那么any size的效果也会发生改变,如下图所示。

    通过上图的演示,相信你已经很好地理解any size的作用了。

    Guidelines

    现在你已经对ConstraintLayout比较熟悉,并且能使用ConstraintLayout来编写一些简单的界面了。不过目前有一个问题可能还比较头疼,刚才我们已经实现了让一个按钮居中对齐的功能,如果我们想让两个按钮共同居中对齐该怎么实现呢?

    其实这个需求很常见,比如说在应用的登录界面,都会有一个登录按钮和一个注册按钮,不管它们是水平居中也好还是垂直居中也好,但肯定都是两个按钮共同居中的。

    想要实现这个功能,仅仅用我们刚刚学的那些知识是不够的,这需要用到ConstraintLayout中的一个新的功能,Guidelines。

    下面我们还是通过实际操作来学习一下Guidelines的用法吧。比如现在已经向界面中添加了登录和注册这两个按钮,如下图所示。

    然后我们希望让这两个按钮在水平方向上居中显示,在垂直方向上都距离底部64dp,那么就需要先添加一个垂直方向上的Guideline,如下图所示。

    我来对上图中的操作进行一下解释。首先点击通知栏中的Guidelines图标可以添加一个垂直或水平方向上的Guideline,这里我们需要的是垂直方向上的。而Guideline默认是使用的dp尺,我们需要选中Guideline,并点击一下最上面的箭头图标将它改成百分比尺,然后将垂直方向上的Guideline调整到50%的位置,这样就将准备工作做好了。

    接下来我们开始实现让两个按钮在水平方向上居中显示,并距离底部64dp的功能,如下图所示。

    可以看到,我们给登录按钮的右边向Guideline添加约束,登录按钮的下面向底部添加约束,并拖动按钮让它距离底部64dp。然后给注册按钮的左边向Guideline添加约束,注册按钮的下面向登录按钮的下面添加约束。这样就实现了让两个按钮在水平方向上居中显示,在垂直方向上都距离底部64dp的功能了。

    自动添加约束

    不过如果界面中的内容变得复杂起来,给每个控件一个个地添加约束也是一件很繁琐的事情。为此,ConstraintLayout中支持自动添加约束的功能,可以极大程度上简化那些繁琐的操作。

    自动添加约束的方式主要有两种,一种叫Autoconnect,一种叫Inference,我们先来看第一种。

    想要使用Autoconnect,首先需要在工具栏中将这个功能启用,默认情况下Autoconnect是不启用的,如下图所示。

    Autoconnect可以根据我们拖放控件的状态自动判断应该如何添加约束,比如我们将Button放到界面的正中央,那么它的上下左右都会自动地添加上约束,如下图所示。

    然后我们在这个Button的下方再放置一个Button,效果如下。

    可以看到,只需要将Button拖放到界面上,Autoconnect会判断我们的意图,并自动给控件添加约束。不过Autoconnect是无法保证百分百准确判断出我们的意图的,如果自动添加的约束并不是你想要的话,还可以在任何时候进行手动修改。总之,可以把它当成一个辅助工具,但不能完全靠它去添加控件的约束。

    以上是Autoconnect的用法,接下来我们看一下Inference的用法。Inference也是用于自动添加约束的,但它比Autoconnect的功能要更为强大,因为AutoConnect只能给当前操作的控件自动添加约束,而Inference会给当前界面中的所有元素自动添加约束。因而Inference比较适合用来实现复杂度比较高的界面,它可以一键自动生成所有的约束。

    下面我们就通过一个例子来演示一下Inference的用法,比如界面上现在有两个TextView,两个EditText,和两个Button,如下图所示。

    接下来我们先将各个控件按照界面设计的位置进行摆放,摆放完成之后点击一下工具栏上的Infer Constraints按钮,就能为所有控件自动添加约束了,如下图所示。

    现在运行一下程序,最终效果如下图所示:

    关注我的技术公众号,每天都有优质技术文章推送。关注我的娱乐公众号,工作、学习累了的时候放松一下自己。

    微信扫一扫下方二维码即可关注:

            

    展开全文
  • SQL中的CONSTRAINT(约束)用法总结

    万次阅读 2018-07-19 11:09:19
    主要就是增加数据约束的。 Oracle中的约束简单介绍 约束 Including Constraints  在数据库中使用约束(constraints)是为了在该数据库中实施所谓的"业务规则"其实就是防止非法信息进入数据库,满足管理...
  • SQL基础--> 约束(CONSTRAINT)

    万次阅读 2010-07-03 22:28:00
    本文介绍了几类不同的约束以及在不同的情况下来实现约束(CONSTRAINT),比如建表时如何创建约束,已经存在的表的约束的添加、删除、启用等等。
  • 前言:虽然现在有很多很有用的验证注解,如@not null,@not blank,@not ...说到自定义验证类型的注解,那就要说说@Constraint这个官方注解了,我们既然自定义了注解,那么注解的逻辑在哪里处理呢?没错,就是这个@Co...
  • 1215 - Cannot add foreign key constraint

    万次阅读 热门讨论 2016-08-21 21:48:16
    最近在做新生入学系统,学生表中包括新生的班级,专业等信息,班级,专业就需要和班级表,专业表进行关联,但是在添加外键的过程中却出现了“Cannot add foreign key constraint” 的问题,也就是不能添加外键约束,...
  • 1.oracle 数据导入后,添加数据报错ORA-00001: unique constraint (XX.SYS_C0011222) violated 违反唯一约束条件场景:1.先创建表-- ------------------------------------------------------- Table `tq_auth_rule...
  • index和constraint index: 1、index分类:单列索引(普通索引,唯一索引,主键索引)、组合索引、全文索引、空间索引 单列索引 一个索引只包含单个列,但一个表中可以有多个单列索引。 组合索引 表中的多个字段组合上...
  • 把一个工程导入as的时候报错,Failed to resolve: ...很明显是constraint-layout的依赖的问题。 怎么解决这个问题呢,其实也不难,主要是你的Androidstudio里没有constraint-layout:1.0.0-alph...
  • 背景:后台服务测试过程中,发现往oracle数据库表中插数据出现一个错误 unique constraint,如下:### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique ...
  • security-constraint和四种认证类型

    千次阅读 2018-07-06 14:19:35
    security-constraint&gt;&lt;security-constraint&gt; 的子元素 &lt;http-method&gt; 是可选的,如果没有 &lt;http-method&gt; 元素,这表示将禁止所有 HTTP 方法访问相应的资源。 子...
  • 最近在Android Studio中导入工程时...Error:(55, 13) Failed to resolve: com.android.support.constraint:constraint-layout:1.0.2 Install Repository and sync project Show in File Show in Project Structu...
  • 约束布局constraint-layout导入失败的解决方案 Could not resolve com.android.support.constraint:constraint-layout:1.1.0.================================================================一、报错代码Unable ...
  • UNIQUE constraint failedの原因

    千次阅读 2017-01-24 13:23:39
    いつの頃からか、変なエラーが出るようになってしまいました。...それが、「SQLSTATE[23000]: Integrity constraint violation: 19 UNIQUE constraint failed」です。 エラーログの1行目は、「WordPress \xe3\x
  • 主要就是增加约束的 以下几种约束 、并 一一列举: 1.主键约束: 要对一个列加主键约束的话,这列就必须要满足的条件就是分空 ...alter table 表格名称 add constraint 约束名称 增加的约束类型 (列名) 例子: a
  • 鉴于网上关于constraint generation和column generation的中文资料相对较少,希望这篇博文也能帮助像我一样的新学者。 首先,是我对constraint generation的理解。标题中的约束生成或者行生成是我自己翻译的,可能...
  • security-constraint&gt; 的子元素 &lt;http-method&gt; 是可选的,如果没有 &lt;http-method&gt; 元素,这表示将禁止所有 HTTP 方法访问相应的资源。  子元素 &lt;auth-constraint&...
  • add constraint <主键名>用法介绍 1.主键约束: 要对一个列加主键约束的话,这列就必须要满足的条件就是分空 因为主键约束:就是对一个列进行了约束,约束为(非空、不重复) 以下是代码 要对一个列加主键,...
1 2 3 4 5 ... 20
收藏数 164,093
精华内容 65,637
关键字:

constraint