精华内容
下载资源
问答
  • (二).约束关键字,约束课堂SQL

    千次阅读 2018-12-27 19:22:25
    constraint 约束 PRIMARY 主要的 UNIQUE 独一无二的 CHECK 检查,核对 FOREIGN 外交的 KEY 关键字 REFERENCES 把...... 约束 什么是约束?...约束就是为了完成数据库中数据的完整性与一致性的...主键约束 PRIMARY KEY ...
    constraint     约束
    PRIMARY     主要的
    UNIQUE      独一无二的	
    CHECK		    检查,核对
    FOREIGN     外交的
    KEY	关键字
    REFERENCES  把...引做参考
    

    约束

    什么是约束?

    约束就是为了完成数据库中数据的完整性与一致性的一种检查机制
    通过定义在数据库中的表来完成约束条件

    有哪些约束?

    • 主键约束 PRIMARY KEY 唯一加非空

    –作用:识别一个行
    –要求:在给一个列建立主键时不能重复不能为空

     注意:推荐使用无意义且有序的数字作为主键,例如1,2,3,4....一张表只能有一个主键
    
    SELECT * FROM STUDENT;
    

    建表后加上主键约束

    ALTER TABLE STUDENT ADD CONSTRAINT PK_STU_ID PRIMARY KEY (ST_ID);
    

    更新主键使其符合约束条件

    UPDATE STUDENT SET ST_ID=7 WHERE ST_NAME ='娜娜';
    
    INSERT INTO STUDENT(ST_ID) VALUES(8);
    
    CREATE TABLE T_USER(
       T_ID NUMBER(4), --PRIMARY KEY,--CONSTRAINT PK_USER_ID PRIMARY KEY,--行级定义
       T_NAME VARCHAR2(20),
       CONSTRAINT PK_USER_ID PRIMARY KEY(T_ID)  --表级定义
    )
    
    SELECT * FROM T_USER;
    

    2.唯一约束 UNIQUE

    作用:确保被指定的字段每行数据不重复,可以为空
    建表后创建

    ALTER TABLE STUDENT ADD CONSTRAINT UN_STU_NAME UNIQUE(ST_NAME);
    

    建表时创建

    CREATE TABLE T_USER(
       T_ID NUMBER(4),
       T_NAME VARCHAR2(20),--UNIQUE,  CONSTRAINT UN_USER_NAME UNIQUE 行级定义
       CONSTRAINT UN_USER_ID UNIQUE(ST_NAME)  --表级定义
    )
    

    3.非空约束

    作用:指定字段必填

    建表后创建

    ALTER TABLE STUDENT MODIFY ST_NAME NOT NULL;
    

    建表时创建

    CREATE TABLE T_USER(
       T_ID NUMBER(4),
       T_NAME VARCHAR2(20) NOT NULL
    )
    

    4.检查约束(自定义约束) CHECK

    –作用:

    建表后创建

    ALTER TABLE STUDENT ADD CONSTRAINT CK_STU_SEX
    CHECK(((ST_SEX='男') OR (ST_SEX='女')) AND (ST_SEX IS NOT NULL));
    

    建表时创建

    CREATE TABLE T_USER(
       T_ID NUMBER(4),
       T_NAME VARCHAR2(20) CHECK(T_NAME='小王子')
        )
    

    5.外键约束 FOREIGN KEY

    作用:用来强制两个表关系,该约束要求定义外键中的每个值必须与引用键相匹配
    外键:从表中引用主表中的引用键的列
    引用键:被外键引用的主键或者唯一键

    CREATE TABLE T_CLASS(
       C_ID NUMBER(5),
       C_NO NUMBER(5),
       C_TEACHER VARCHAR2(20)
    )
    

    建唯一键

    ALTER TABLE T_CLASS ADD CONSTRAINT UN_CLASS_CNO UNIQUE(C_NO);
    
    INSERT INTO T_CLASS VALUES(1,1809,'梁辰');
    INSERT INTO T_CLASS VALUES(2,1810,'惊蛰');
    
    CREATE TABLE T_STU(
       S_ID NUMBER(5),
       S_NAME VARCHAR2(20),
       C_NO NUMBER(5)
    )
    

    定义外键

    ALTER TABLE T_STU ADD CONSTRAINT FK_STU_CNO
    FOREIGN KEY (C_NO) REFERENCES T_CLASS(C_NO);
    
    INSERT INTO T_STU VALUES(1,'谈笑人生',1810);
    INSERT INTO T_STU VALUES(2,'哈哈哈',1810);
    INSERT INTO T_STU VALUES(3,'番茄',1809);
    

    INSERT INTO T_STU VALUES(4,‘再也没有’,1809);

    INSERT INTO T_STU VALUES(5,'孙悟空',1811);
    
    SELECT * FROM T_STU;
    SELECT * FROM T_CLASS;
    
    
    
    DELETE FROM T_STU WHERE S_ID=1;
    
    DELETE FROM T_CLASS WHERE C_ID=1;
    

    级联关系

    --ON DELETE CASCADE (删除主表数据顺带删除对应子表整行数据)
    ALTER TABLE T_STU ADD CONSTRAINT FK_STU_CNO
    FOREIGN KEY (C_NO) REFERENCES T_CLASS(C_NO) ON DELETE CASCADE;
    
    --ON DELETE SET NULL(删除主表数据把子表对应外键数据设置为NULL)
    ALTER TABLE T_STU ADD CONSTRAINT FK_STU_CNO
    FOREIGN KEY (C_NO) REFERENCES T_CLASS(C_NO) ON DELETE      SET NULL;
    
    展开全文
  • 首先,这个是mysql中对应的约束内容 [img]http://dev.mysql.com/doc/workbench/en/images/wb-table-editor-columns-tab.png[/img] primary key 和 not null、unique就不用说啦 重点是几个mysql workbench工具...
    首先,这个是mysql中对应的约束内容
    
    [img]http://dev.mysql.com/doc/workbench/en/images/wb-table-editor-columns-tab.png[/img]

    primary key 和 not null、unique就不用说啦

    重点是几个mysql workbench工具中的缩写
    AI比较常用,就是自增主键
    BIN表示的是对于字段中的取值区分大小写,比如
    SELECT * FROM **table WHERE binary name LIKE 'a%';
    SELECT * FROM **table WHERE binary name LIKE 'A%';

    UN代表unsigned,就是不小于0的约束
    ZF代表zero fill,比如,int(4),正常存入1,加上ZF就会是0001,填充位

    如下是官方文档
    [url]http://dev.mysql.com/doc/workbench/en/wb-table-editor-columns-tab.html[/url]
    展开全文
  • Oracle4-之约束关键字constraint

    千次阅读 2016-11-23 14:29:48
    约束简介 约束用于确保数据库数据满足特定的商业逻辑或者企业规则,如果定义了约束,并且数据不符 合约束,那么DML操作(INSERT、UPDATE、DELETE)将不能成功执行。约束包括NOT NULL、UNIQUE、PRIMARY KEY、...

    约束简介
    约束用于确保数据库数据满足特定的商业逻辑或者企业规则,如果定义了约束,并且数据不符

    合约束,那么DML操作(INSERT、UPDATE、DELETE)将不能成功执行。约束包括NOT NULL、UNIQUE、PRIMARY KEY、FOREING KEY 以及CHECK等五种类型

    定义约束
    列级约束:
    column [CONSTRAINT constraint_name] constraint_type
    表级约束:
    column ,...,
    [CONSTRAINT constraint_name] constraint_type (column,...)

    1.定义NOT NULL约束
    NOT NULL 约束只能在列级定义,不能在表级定义
    例:
    CREATE TABLE emp01(
    eno INT  NOT NULL,
    name VARCHAR2(10) CONSTRAINT nn_name2 NOT NULL,
    salary NUMBER(6,2)
    );
    上例中,eno列与name列上定义了NOT NULL约束,其中eno列的NOT NULL约束没有指定约束名,而

    name列则指定了约束名nn_name。
    可以通过查询user_constraints字典来查看所定义的约束,如:
    SQL> select constraint_name,constraint_type from user_constraints
    2  where table_name='EMP01';

    CONSTRAINT_NAME                                              CO
    ------------------------------------------------------------ --
    SYS_C0010618                                                 C
    NN_NAME                                                      C
    可见,没有给约束名的,系统将会自动的定义一个约束名称,其中约束类型中,P:表示主键,R:

    表示外键,C表示NOT NULL或CHECK,U表示UNIQUE。且系统中同一方案下的的约束名不能重复

     

    2.定义UNIQUE约束
    定义了惟一约束之后,惟一约束列的列值不能重复,但可以为NULL。UNIQUE约束既可以在列级

    定义,也可以在表级定义
    例:
    CREATE TABLE emp02(
    eno INT UNIQUE,name VARCHAR2(10) CONSTRAINT u_name UNIQUE,
    salary NUMBER(6,2)
    );
    同样,如果没有给出约束名,系统会自动定义一个名称,可从查询结果得出
    SQL> select constraint_name,constraint_type from user_constraints
    2  where table_name='EMP02';

    CONSTRAINT_NAME                                              CO
    ------------------------------------------------------------ --
    SYS_C0010623                                                 U
    U_NAME
    U

    3.定义PRIMARY KEY 约束
    当定义主键约束后,主键约束列的列值不仅不能重复,而且也不能为NULL。主键约束既可以在

    列级定义,也可以在表级定义。一张表最多只能具有一个主键约束,当一个表中的多个列都要为

    主键是,可以在表级定义。
    例1:列级定义主键
    CREATE TABLE depto04(
    dno INT PRIMARY KEY,
    dname VARCHAR2(10),loc VARCHAR2(20)
    );
    通过查询user_constraints可得出
    SQL>  select constraint_name ,constraint_type from user_constraints
    2  where table_name='DEPT04';

    CONSTRAINT_NAME                                              CO
    ------------------------------------------------------------ --
    SYS_C0010625                                                 P
    通过查询user_cons_columns可得出
    SQL> select constraint_name,column_name from user_cons_columns
    2  where table_name='DEPT04';

    CONSTRAINT_NAME                                              COLUMN_NAME
    ------------------------------------------------------------ ------------

    SYS_C0010625                                                 DNO
    例2:表级定义主键
    CREATE TABLE dept05(
    dno INT,
    dname VARCHAR2(10),loc VARCHAR2(20),
    PRIMARY KEY(dno,dname)
    );
    通过查询user_constraints可以得出
    SQL> select constraint_name,constraint_type from user_constraints
    2  where table_name='DEPT05';

    CONSTRAINT_NAME                                              CO
    ------------------------------------------------------------ --
    SYS_C0010626                                                 P
    通过查询user_cons_columns可得出
    SQL> select constraint_name,column_name from user_cons_columns
    2  where table_name='DEPT05';

    CONSTRAINT_NAME                                              COLUMN_NAME
    ------------------------------------------------------------ -------------

    SYS_C0010626                                                 DNO
    SYS_C0010626                                                 DNAME
    可见,当在表级定义时,约束名称将会相同,而在user_cons_columns查询是,每一列将对应约束

    名称相同的两条记录

     

    4.定义FOREING KEY约束
    当定义了外部键约束之后,要求外部键列的数据必须在主表的主键列(或惟一列)中存在,或

    者为NULL,FOREING KEY约束既可以在列级定义,也可以在表级定义。
    关键字说明:
    FOREING KEY:该选项用于指定在表级定义外部键约束。当在表级定义外部键约束时必须指定该选

    项,在列级定义外部键约束不需要指定该选项
    REFERENCES:该选项用于指定主表名及其主键列。当定义外部键约束时,该选项必须指定。
    ON DELETE CASCAED:该选项用于指定级联删除选项。如果在定义外部键约束时指定了该选项,那

    么当删除主表数据时会级联删除从表的相关数据。
    ON DELECT SET NULL:该选项用于指定转换相关的外部键值为NULL,如果在定义外部键约束时指定

    了该选项,那么当删除主表数据时会将从表外部键列的数据设置为NULL。
    例1:列级定义外键约束
    CREATE TABLE emp04(
    eno INT,name VARCHAR2(10),salary NUMBER(6,2),
    dno INT CONSTRAINT fk_dno REFERENCES dept04(dno)
    );
    SQL> select constraint_name,constraint_type from user_constraints
    2  where table_name='EMP04';

    CONSTRAINT_NAME                                              CO
    ------------------------------------------------------------ --
    FK_DNO                                                       R
    SQL> select constraint_name,column_name from user_cons_columns
    2  where table_name='EMP04';

    CONSTRAINT_NAME                                              COLUMN_NAME
    ------------------------------------------------------------ -----------

    FK_DNO                                                       DNO
    例2:表级定义外键约束
    CREATE TABLE emp05(
    eno INT,name VARCHAR2(10),salary NUMBER(6,2),
    dno INT,
    CONSTRAINT fk_dno_name FOREIGN KEY(dno,name) REFERENCES dept05(dno,dname)
    );
    SQL> select constraint_name,constraint_type from user_constraints
    2  where table_name='EMP05'
    3  ;

    CONSTRAINT_NAME                                              CO
    ------------------------------------------------------------ --
    FK_DNO_NAME                                                  R
    SQL> select constraint_name,column_name from user_cons_columns
    2  where table_name='EMP05';

    CONSTRAINT_NAME                                              COLUMN_NAME
    ------------------------------------------------------------ -----------

    FK_DNO_NAME                                                  DNO
    FK_DNO_NAME                                                  NAME

    5.定义CHECK约束
    CHECK约束既可以在列级定义,也可以在表级定义。CHECK约束允许列为NULL。
    例:
    CREATE TABLE emp06(
    eno INT,name VARCHAR2(10),salary NUMBER(6,2),
    CHECK (salary BETWEEN 1000 AND 5000)
    );
    SQL>  select constraint_name,constraint_type from user_constraints
    2   where table_name='EMP06';

    CONSTRAINT_NAME                                              CO
    ------------------------------------------------------------ --
    SYS_C0010629                                                 C
    SQL> select constraint_name,column_name from user_cons_columns
    2  where table_name='EMP06';

    CONSTRAINT_NAME                                              COLUMN_NAME
    ------------------------------------------------------------ -----------

    SYS_C0010629                                                 SALARY

    6.定义复合约束
    复合约束即在表级定义,基于多列的复合约束,如:
    CREATE TABLE dept05(
    dno INT,
    dname VARCHAR2(10),loc VARCHAR2(20),
    PRIMARY KEY(dno,dname)
    );或
    CREATE TABLE emp05(
    eno INT,name VARCHAR2(10),salary NUMBER(6,2),
    dno INT,
    CONSTRAINT fk_dno_name FOREIGN KEY(dno,name) REFERENCES dept05(dno,dname)
    );

     

    9.3维护约束
    9.3.1增加约束
    如果增加UNIQUE、PRIMARY KEY、FOREIGN KEY 和CKECK 必须使用ALTER TABLE语句的ADD子句;

    如果增加NOT NULL约束,那么必须使用ALTER TABLE语句的MODIFY子句,如:
    ALTER TABLE table_name ADD [CONSTRAINT constraint_name]
    constraint_type (column,...)
    ALTER TABLE table_name MODIFY column
    [CONSTRAINT constraint_name] NOT NULL;
    9.3.2修改约束名
    在同一个方案中,约束名必须惟一,并且约束名也不能与其他对象同名。当鱫IMPDP工具或者IMP

    工具导入其他对象时,如发现有同名的对象,将会出错
    语法:
    ALTER TABLE table_name RENAME CONSTRAINT old_constraint_name
    TO new_constraint_name;
    例:
    ALTER TABLE emp01 RENAME CONSTRAINT SYS_C005028
    TO ck_emp01_salary;
    9.3.3 删除约束
    当删除特定表的主键约束时,如果该表具有相关的从表,那么在删除主键约束

    时必须带有CASCAED选项
    语法:
    ALTER TABLE table_name DROP
    CONSTRAINT constraint_name |PRIMARY KEY
    例1
    ALTER TABLE emp01 DROP CONSTRAINT ck_emp01_salary;
    例2
    ALTER TABLE dept01 DROP PRIMARY KEY CASCAED
    9.3.4禁止约束
    禁止约束指使约束临时失效。当禁止了约束之后,约束规则将不再生效。在使用SQL*LOADER或

    INSERT装载数据之前,为了加快数据装载速度,应该首先禁止约束,然后装载数据。
    语法:
    ALTER TABLE table_name
    DISABLE CONSTRAINT constaint_name [CASCAED];--CASCAED用于指定级联禁止从表的外部键

    约束
    例:
    ALTER TABLE emp05 DISABLE CONSTAINT SYS_C00502;
    9.3.5 激活约束
    语法:
    ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;
    例:
    ALTER TABLE emp05 ENABLE CONSTRAINT SYS_C005022;
    9.4 显示约束信息
    1.USER_CONSTRAINTS
    2.USER_CONS_COLUMNS

    展开全文
  • 10. 数据库约束-主键约束-唯一约束-非空约束-默认值约束概述约束其实就是一种限制,用于修饰表中的列. 通过这种限制来保证表中数据的正确性、有效性和完整性。约束的类型约束名约束关键字主键...

    10. 数据库约束-主键约束-唯一约束-非空约束-默认值

    约束概述

    约束其实就是一种限制,用于修饰表中的列. 通过这种限制来保证表中数据的正确性、有效性和完整性。

    约束的类型

     

    约束名约束关键字
    主键primary key
    非空not null
    唯一unique
    外键foreign key   ... references
    默认default

    1. 主键约束(重点)

    1.1 主键的作用

    用来标注一条记录的唯一性,每个表都应该有一个主键,并且每个表只能有一个主键。有些记录的 name,age,score 字段的值都一样时,那么就没法区分这些数据,造成数据库的记录冗余不唯一,这样就不方便管理数据

    哪个字段应该作为表的主键? 通常不用业务字段作为主键,单独给每张表设计一个id的字段,把id作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。

    1.2 创建主键

    # 主键:PRIMARY KEY
    # 主键的特点:
     1. 主键字段值唯一(唯一不可重复)
     2. 主键列不能为NULL
     3. 一个表中只能有一个主键,但主键可以是多个字段 (联合主键)
    

    创建主键方式:

    -- 方式1:创建表时,添加主键约束 (字段约束区)
     格式:
      create table 表名 ( 
       字段名称1 字段类型 字段约束区,  
       字段名称2 字段类型 字段约束区
      );
    
    -- 方式2:创建表时,在约束区域添加约束(扩展)
     格式1:单一主键
      create table 表名 (
          字段名称1 字段类型,  
          字段名称2 字段类型,  
          primary key(字段名称1)  
      );
    
     格式2:联合主键
      create table 表名 (
          字段名称1 字段类型,  
          字段名称2 字段类型,  
          primary key(字段名称,字段名称1)  
      );
    
    -- 方式3:给已有表中添加主键(扩展)
     alter table 表名 add primary key(字段名称);
    

    具体操作:

    1.2.1 创建表用户表, 包含字段(id, name)将id做为主键

    方式1:  建表时在字段的约束区添加主键约束

    -- 主键约束
    -- 方式1: 建表时在字段的约束区添加主键约束
    CREATE TABLE user1(
     id INT PRIMARY KEY, # 在字段的约束区添加主键约束
     `name` VARCHAR(20)
    );
    -- 添加数据信息
    INSERT INTO user1 VALUES(1,'tom'); -- 正常插入
    INSERT INTO user1 VALUES(NULL,'tom'); -- 插入异常(主键不可为空): Column 'id' cannot be null
    INSERT INTO user1 VALUES(1,'tom'); -- 插入异常(主键不可重复): Duplicate entry '1' for key 'PRIMARY'
    

    执行如下:

    -- 方式1: 建表时在字段的约束区添加主键约束
    mysql> CREATE TABLE user1(
        -> id INT PRIMARY KEY, # 在字段的约束区添加主键约束
        -> `name` VARCHAR(20)
        -> );
    Query OK, 0 rows affected (0.01 sec)
    
    -- 查看创建后的所有表
    mysql> show tables;
    +---------------+
    | Tables_in_db1 |
    +---------------+
    | product       |
    | stu3          |
    | user1         |
    +---------------+
    3 rows in set (0.01 sec)
    
    mysql> 
    -- 正常插入
    mysql> INSERT INTO user1 VALUES(1,'tom');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from user1;
    +----+------+
    | id | name |
    +----+------+
    |  1 | tom  |
    +----+------+
    1 row in set (0.00 sec)
    
    mysql> 
    
    -- 插入异常(主键不可为空): Column 'id' cannot be null
    mysql> INSERT INTO user1 VALUES(NULL,'tom');
    ERROR 1048 (23000): Column 'id' cannot be null
    mysql> 
    
    -- 插入异常(主键不可重复): Duplicate entry '1' for key 'PRIMARY'
    mysql> INSERT INTO user1 VALUES(1,'tom');
    ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
    mysql> 
    

    方式2: 建表时在约束区添加主键约束

    -- 方式2: 建表时在约束区添加主键约束
    CREATE TABLE user2(
     id INT, 
     `name` VARCHAR(20),
     PRIMARY KEY (id)
    );
    

    执行如下:

    -- 方式2: 建表时在约束区添加主键约束
    mysql> CREATE TABLE user2(
        -> id INT, 
        -> `name` VARCHAR(20),
        -> PRIMARY KEY (id) -- 设置主键约束
        -> );
    Query OK, 0 rows affected (0.01 sec)
    
    -- 查看user2与user1的表结构
    mysql> desc user2;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | NO   | PRI | NULL    |       | -- 可以看到 id 的 key 值为 PRI 与 user1 表一致
    | name  | varchar(20) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    
    mysql> desc user1;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | NO   | PRI | NULL    |       | 
    | name  | varchar(20) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    
    mysql> 
    

    方式3: 创建完表后,通过修改表结构添加主键约束

    -- 方式3: 创建完表后,通过修改表结构添加主键约束
    CREATE TABLE user3(
     id INT, 
     `name` VARCHAR(20)
    );
    -- 修改表添加主键
    ALTER TABLE user3 ADD PRIMARY KEY (id);
    

    执行如下:

    -- 方式3: 创建完表后,通过修改表结构添加主键约束
    mysql> CREATE TABLE user3(
        -> id INT, 
        -> `name` VARCHAR(20)
        -> );
    Query OK, 0 rows affected (0.01 sec)
    -- 修改表添加主键
    mysql> ALTER TABLE user3 ADD PRIMARY KEY (id);
    Query OK, 0 rows affected (0.03 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    -- 查看user3的表结构,可以看到 id 已经设置为主键
    mysql> desc user3;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | NO   | PRI | NULL    |       |
    | name  | varchar(20) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    
    mysql> 
    

    1.2.2 创建表用户表, 包含字段(id, name) 将id和name做为联合主键

    上面我们将 id 作为单一主键,而还有多个字段作为 联合主键的情况,如下:

    image-20200527101914892

    image-20200527101757783
    -- 联合主键
    CREATE TABLE user4(
     id INT, 
     `name` VARCHAR(20),
     PRIMARY KEY (id,`name`)
    );
    -- 保证id和name字段不为空,然后联合判断唯一性
    INSERT INTO user4 VALUES(1,'tom'); -- 正常插入
    INSERT INTO user4 VALUES(2,"tom"); -- 正常插入
    INSERT INTO user4 VALUES(1,"rose"); -- 正常插入
    INSERT INTO user4 VALUES(2,"rose"); -- 正常插入
    INSERT INTO user4 VALUES(1,"tom"); -- 插入异常:Duplicate entry '1-tom' for key 'PRIMARY'
    INSERT INTO user4 VALUES(NULL,"jack"); -- 插入异常:Column 'id' cannot be null
    INSERT INTO user4 VALUES(3,NULL); -- 插入异常:Column 'name' cannot be null
    

    注意 : 一张表中只有一个主键 , 主键可以为多个字段 , 不过我们一般增加一个字段 id 来作为主键.

    执行如下:

    -- 联合主键: 包含 id 与 name 两个字段作为主键,要求表中的数据 id 与 name 结合在一起不能重复
    mysql> CREATE TABLE user4(
        -> id INT, 
        -> `name` VARCHAR(20),
        -> PRIMARY KEY (id,`name`)
        -> );
    Query OK, 0 rows affected (0.02 sec)
    
    -- 保证id和name字段不为空,然后联合判断唯一性
    -- 正常插入
    mysql> INSERT INTO user4 VALUES(1,'tom');
    Query OK, 1 row affected (0.01 sec)
    
    -- 正常插入: 虽然 name 字段与上一条数据重复,但是 id 不一致
    mysql> INSERT INTO user4 VALUES(2,"tom");
    Query OK, 1 row affected (0.01 sec)
    
    -- 正常插入: id 与 第一条数据一致,但是 name 数据不一致
    mysql> INSERT INTO user4 VALUES(1,"rose");
    Query OK, 1 row affected (0.00 sec)
    
    -- 正常插入
    mysql> INSERT INTO user4 VALUES(2,"rose");
    Query OK, 1 row affected (0.00 sec)
    
    -- 插入异常:Duplicate entry '1-tom' for key 'PRIMARY'
    mysql> INSERT INTO user4 VALUES(1,"tom");
    ERROR 1062 (23000): Duplicate entry '1-tom' for key 'PRIMARY'
    
    -- 插入异常:Column 'id' cannot be null
    mysql> INSERT INTO user4 VALUES(NULL,"jack");
    ERROR 1048 (23000): Column 'id' cannot be null
    
    -- 插入异常:Column 'name' cannot be null
    mysql> INSERT INTO user4 VALUES(3,NULL);
    ERROR 1048 (23000): Column 'name' cannot be null
    

    1.3 删除主键

    ALTER TABLE 表名 DROP PRIMARY KEY;

    具体操作:

    • 删除user1表的主键

    ALTER TABLE user1 DROP PRIMARY KEY;
    

    执行如下:

    -- 删除主键之前的表结构
    mysql> desc user1;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | NO   | PRI | NULL    |       | -- id 为主键
    | name  | varchar(20) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.01 sec)
    
    -- 删除user1表的主键
    mysql> alter table user1 drop primary key;
    Query OK, 1 row affected (0.04 sec)
    Records: 1  Duplicates: 0  Warnings: 0
    
    -- 删除主键之后的表结构,可以看到 id 已经不是主键了。
    mysql> desc user1;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | NO   |     | NULL    |       |
    | name  | varchar(20) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    
    mysql> 
    

    1.4 主键自增 AUTO_INCREMENT

    主键如果让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成主键字段的值AUTO_INCREMENT 表示自动增长(字段类型是整型数字)

    具体操作:

    创建学生表user5, 包含字段(id, name)将id做为主键并自动增长

    CREATE TABLE user5 (
     id INT PRIMARY KEY AUTO_INCREMENT,
     name VARCHAR(20)
    );
    
    • 插入数据

    -- 主键默认从1开始自动增长
    INSERT INTO user5 (name) VALUES ('唐僧');
    INSERT INTO user5 (name) VALUES ('孙悟空');
    INSERT INTO user5 VALUES (null,'猪八戒');
    INSERT INTO user5 VALUES (null,'沙僧');
    

    执行如下:

    -- 创建user5表,并设置 id 字段为自增主键
    mysql> CREATE TABLE user5 (
        -> id INT PRIMARY KEY AUTO_INCREMENT,
        -> name VARCHAR(20)
        -> );
    Query OK, 0 rows affected (0.01 sec)
    
    -- 插入数据
    mysql> INSERT INTO user5 (name) VALUES ('唐僧');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> INSERT INTO user5 (name) VALUES ('孙悟空');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO user5 VALUES (null,'猪八戒');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO user5 VALUES (null,'沙僧');
    Query OK, 1 row affected (0.00 sec)
    
    -- 查看 user5 表中的 id 数据 从 1 开始自增
    mysql> select * from user5;
    +----+-----------+
    | id | name      |
    +----+-----------+
    |  1 | 唐僧      |
    |  2 | 孙悟空    |
    |  3 | 猪八戒    |
    |  4 | 沙僧      |
    +----+-----------+
    4 rows in set (0.00 sec)
    
    mysql> 
    

    DELETE和TRUNCATE的区别

    DELETE删除表中的数据,不重置AUTO_INCREMENT的值
    TRUNCATE摧毁表,重建表,AUTO_INCREMENT重置为1
    如果想自定义id的值,可以使用下面的sql进行设置,一般不需要
    ALTER TABLE 表名 AUTO_INCREMENT=起始值;
    

    下面我们来演示一下:

    演示 DELETE 删除表数据 对于 自增字段的影响

    -- delete 删除之前的 user5 表数据,此时自增 id = 4
    mysql> select * from user5;
    +----+-----------+
    | id | name      |
    +----+-----------+
    |  1 | 唐僧      |
    |  2 | 孙悟空    |
    |  3 | 猪八戒    |
    |  4 | 沙僧      |
    +----+-----------+
    4 rows in set (0.00 sec)
    
    -- delete 删除表数据
    mysql> delete from user5;
    Query OK, 4 rows affected (0.00 sec)
    
    -- 插入一条数据,然后查看表中的 id 自增到 5. 
    mysql> INSERT INTO user5 VALUES (null,'沙僧');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from user5;
    +----+--------+
    | id | name   |
    +----+--------+
    |  5 | 沙僧   | -- 说明 delete 删除的表数据,并不会重置 id 的自增,而是接着之前的自增值继续自增
    +----+--------+
    1 row in set (0.00 sec)
    
    mysql> 
    

    演示 TRUNCATE 删除表数据 对于 自增字段的影响

    -- truncate 表之前的 user5 数据
    mysql> select * from user5;
    +----+--------+
    | id | name   |
    +----+--------+
    |  5 | 沙僧   |
    +----+--------+
    1 row in set (0.00 sec)
    
    -- truncate 删除 user5 表数据
    mysql> truncate table user5;
    Query OK, 0 rows affected (0.01 sec)
    
    -- 再插入一条数据,可以发现自增id重置为1
    mysql> INSERT INTO user5 VALUES (null,'沙僧');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from user5;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 | 沙僧   |
    +----+--------+
    1 row in set (0.00 sec)
    
    mysql> 
    

    修改表的主键自增初始值

    -- 修改 user5 表的自增初始值为 10
    mysql> alter table user5 auto_increment=10;
    Query OK, 0 rows affected (0.00 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    -- 再插入一条数据,看看自增值
    mysql> INSERT INTO user5 VALUES (null,'沙僧');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from user5;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 | 沙僧   |
    | 10 | 沙僧   | -- 可以看到从 10 开始自增了。
    +----+--------+
    2 rows in set (0.00 sec)
    
    mysql> 
    

    2. 唯一约束 UNIQUE

    在这张表中这个字段的值不能重复

    2.1 唯一约束的基本格式

    字段名 字段类型 UNIQUE

    2.2 实现唯一约束

    具体操作:

    • 创建学生表st7, 包含字段(id, name),name这一列设置唯一约束,不能出现同名的学生

    CREATE TABLE st7 (
     id INT,
     NAME VARCHAR(20) UNIQUE
    );
    
    • 添加数据,查看数据重复的问题

    INSERT INTO st7 VALUES (1, '貂蝉');
    INSERT INTO st7 VALUES (2, '西施');
    INSERT INTO st7 VALUES (3, '王昭君');
    INSERT INTO st7 VALUES (4, '杨玉环');
    
    -- 插入相同的名字出现name重复: Duplicate entry '貂蝉' for key 'name'
    INSERT INTO st7 VALUES (5, '貂蝉');
    
    -- 出现多个null的时候会怎样?因为null是没有值,所以不存在重复的问题
    INSERT INTO st7 VALUES (5, NULL);
    INSERT INTO st7 VALUES (6, NULL);
    

    执行如下:

    -- 创建学生表st7, 包含字段(id, name),name这一列设置唯一约束,不能出现同名的学生
    mysql> CREATE TABLE st7 (
        -> id INT,
        -> NAME VARCHAR(20) UNIQUE
        -> );
    Query OK, 0 rows affected (0.02 sec)
    
    -- 插入四条数据
    mysql> INSERT INTO st7 VALUES (1, '貂蝉');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> INSERT INTO st7 VALUES (2, '西施');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO st7 VALUES (3, '王昭君');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO st7 VALUES (4, '杨玉环');
    Query OK, 1 row affected (0.00 sec)
    
    -- 插入相同的名字出现name重复: Duplicate entry '貂蝉' for key 'name'
    mysql> INSERT INTO st7 VALUES (5, '貂蝉');
    ERROR 1062 (23000): Duplicate entry '貂蝉' for key 'NAME'
    
    -- 出现多个null的时候会怎样?因为null是没有值,所以不存在重复的问题
    mysql> INSERT INTO st7 VALUES (5, NULL);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO st7 VALUES (6, NULL);
    Query OK, 1 row affected (0.00 sec)
    
    -- 可以看到 null 可以重复插入
    mysql> select * from st7;
    +------+-----------+
    | id   | NAME      |
    +------+-----------+
    |    1 | 貂蝉      |
    |    2 | 西施      |
    |    3 | 王昭君    |
    |    4 | 杨玉环    |
    |    5 | NULL      |
    |    6 | NULL      |
    +------+-----------+
    6 rows in set (0.00 sec)
    
    mysql> 
    

    3. 非空约束 NOT NULL

    被修饰的这个字段必须设置值,不能是NULL

    3.1 非空约束的基本格式

    字段名 字段类型 NOT NULL

    3.2 实现非空约束

    具体操作:

    • 创建表学生表st8, 包含字段(id,name,gender)其中name不能为NULL

    CREATE TABLE st8 (
     id INT,
     NAME VARCHAR(20) NOT NULL,
     gender CHAR(2)
    );
    
    • 添加一条完整的记录

    INSERT INTO st8 VALUES (1, '郭富城', '男');
    INSERT INTO st8 VALUES (2, '黎明', '男');
    INSERT INTO st8 VALUES (3, '张学友', '男');
    INSERT INTO st8 VALUES (4, '刘德华', '男');
    
    -- 姓名不赋值出现姓名不能为null: Column 'name' cannot be null
    INSERT INTO st8 VALUES (5, NULL, '男');
    

    执行如下:

    -- 创建表学生表st8, 包含字段(id,name,gender)其中name不能为NULL
    mysql> CREATE TABLE st8 (
        -> id INT,
        -> NAME VARCHAR(20) NOT NULL,
        -> gender CHAR(2)
        -> );
    Query OK, 0 rows affected (0.01 sec)
    
    -- 插入四条数据
    mysql> INSERT INTO st8 VALUES (1, '郭富城', '男');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> INSERT INTO st8 VALUES (2, '黎明', '男');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO st8 VALUES (3, '张学友', '男');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO st8 VALUES (4, '刘德华', '男');
    Query OK, 1 row affected (0.00 sec)
    
    -- 姓名不赋值出现姓名不能为null: Column 'name' cannot be null
    mysql> INSERT INTO st8 VALUES (5, NULL, '男');
    ERROR 1048 (23000): Column 'NAME' cannot be null
    mysql> 
    
    -- 可以看到设置了非空约束后,st8表无法插入 null 数据
    mysql> select * from st8;
    +------+-----------+--------+
    | id   | NAME      | gender |
    +------+-----------+--------+
    |    1 | 郭富城    | 男     |
    |    2 | 黎明      | 男     |
    |    3 | 张学友    | 男     |
    |    4 | 刘德华    | 男     |
    +------+-----------+--------+
    4 rows in set (0.00 sec)
    
    mysql> 
    

    4. 默认值 DEFAULT

    往表中添加数据时,如果不指定这个字段的数据,就使用默认值

    4.1 默认值格式

    字段名 字段类型 DEFAULT 默认值

    4.2 实现字段默认值

    具体操作:

    • 创建一个学生表 st9,包含字段(id,name,address), 地址默认值是广州

    CREATE TABLE st9 (
     id INT,
     NAME VARCHAR(20),
     address VARCHAR(50) DEFAULT '广州'
    );
    
    • 添加一条记录,使用默认地址

    INSERT INTO st9 (id, NAME) VALUES (1, '刘德华');
    

    • 添加一条记录,不使用默认地址

    INSERT INTO st9 VALUES (2, '张学友', '香港');
    

    执行如下:

    -- 创建一个学生表 st9,包含字段(id,name,address), 地址默认值是广州
    mysql> CREATE TABLE st9 (
        -> id INT,
        -> NAME VARCHAR(20),
        -> address VARCHAR(50) DEFAULT '广州' -- 设置默认值
        -> );
    Query OK, 0 rows affected (0.02 sec)
    
    -- 插入一条数据,不填写 address 的值
    mysql> INSERT INTO st9 (id, NAME) VALUES (1, '刘德华');
    Query OK, 1 row affected (0.00 sec)
    
    -- 可以看到数据自动设置为默认值: 广州
    mysql> select * from st9;
    +------+-----------+---------+
    | id   | NAME      | address |
    +------+-----------+---------+
    |    1 | 刘德华    | 广州    |
    +------+-----------+---------+
    1 row in set (0.00 sec)
    
    -- 添加一条记录,不使用默认地址
    mysql> INSERT INTO st9 VALUES (2, '张学友', '香港');
    Query OK, 1 row affected (0.00 sec)
    
    -- 如果设置了值,那么则不会写入默认值
    mysql> select * from st9;
    +------+-----------+---------+
    | id   | NAME      | address |
    +------+-----------+---------+
    |    1 | 刘德华    | 广州    |
    |    2 | 张学友    | 香港    | -- 使用输入的值
    +------+-----------+---------+
    2 rows in set (0.00 sec)
    
    mysql> 
    
    展开全文
  • 主键约束和唯一约束

    千次阅读 2019-03-07 21:30:59
    主键约束和唯一约束主键约束和唯一约束的区别普通索引和唯一索引Mysql中的索引普通索引(非唯一索引)唯一索引唯一索引主键约束的唯一索引唯一约束的唯一索引创建唯一索引删除主键约束和唯一约束自动创建的唯一索引 ...
  • MySQL 主键约束

    2021-09-01 21:27:21
    主键约束 PRIMARY KEY 主键在mysql中使用非常频繁,为了更快的查找表中的数据,都会在表中设置一个主键。主键分为单字段主键和多字段联合主键。 设置单子段主键 在创建表时,通过 PRIMARY KEY 关键字指定主键。 第...
  • 主键约束----复合主键

    2020-01-12 18:33:29
    主键约束 (一)概述 1、关键字 :primary key 2、特点:增加主键约束的列(字段)的值必须是非空 + 唯一的,一个表只有一个主键约束 3、作用:保证表中不会出现两条无法区分的记录 4、要求:每一张表都必须有主键...
  • MySQL||主键(primary key)及主键约束

    千次阅读 2019-07-24 22:43:02
    选取设置主键约束的字段 主键约束即在表中定义一个主键来唯一确定表中每一行数据的标识符。主键可以是表中的某一列或者多列的组合,其中由多列组合的主键称为复合主键。主键应该遵守下面的规则: 每个表只能...
  • 四种条件约束:非空 唯一性 主键约束 外键约束 非空约束(not null)约束的字段不能为空值,必须赋具体的数据 CREATE TABLE t_user ( id INT (4), NAME VARCHAR(32) NOT NULL, class BIGINT(1000) ); 这里的...
  • SQLserver数据库--主键约束

    千次阅读 2019-04-11 11:31:57
    1、主键约束 创建表时设置约束的方式有两种:一种是在列级...在创建表时设置主键约束 ①在列级设置主键约束: CREATE TABLE table_name ( column_name datatype [[CONSTRAINT constraint_name]primark key] [,…n] ...
  • SQLserver数据库——表中主键约束

    千次阅读 2019-02-05 23:56:50
    常见五种约束: 1.主键约束 ...下面就让我们分别探讨这五类约束设置添加以及删除等用法吧!...1、主键约束 ...创建表时设置约束的方式有两种:一种是...在创建表时设置主键约束 ①在列级设置主键约束: CREATE...
  • 这里写目录标题约束非空约束唯一约束主键约束外键约束检查约束三级目录 约束 约束:在创建表时,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性,有效性,完整性。 非空约束 非空约束...
  • 第一范式要求每张表都要有主键,因此主键约束是非常重要的,而且*主键约束是外键关联的基础条件。主键约束为表之间的关联提供了...在CREATE TABLE语句中定义主键约束:在字段定义后添加PRIMARY KEY关键字即可。不过...
  • [img=https://img-bbs.csdn.net/upload/202004/07/1586241279_80328.jpg][/img]
  • 主键约束

    2012-08-07 00:46:29
    insert into students(stu_name, gender, age) values('zhangsan', '男', ...--定义主键约束有两种方法 --(直接在建表时定义) create table students(  stu_no number(4) primary key not null,  stu_name varc
  • SQLServer 2012 主键约束(定义主键、删除主键)

    万次阅读 多人点赞 2019-04-21 18:18:00
    文章目录定义主键使用SSMS工具定义主键使用SQL方式定义主键方式一:在创建数据表的时候定义主键方式二:修改数据表定义主键删除主键使用SSMS工具删除主键方式一:在对象资源管理器中删除主键方式二:在表设计器中...
  • SQLServer增删改查,创建主键约束、唯一约束、外键约束 SQL语句顺序如下: SELECT 子句 FROM 子句 where 子句 group by 子句 having 子句 order by 子句
  • 主键约束:primary key 非空约束:not null 唯一约束:unique 外键约束:foreign key 1.1 非空约束:not null 1)在创建表时添加约束: CREATE TABLE stu( id INT, NAME VARCHAR(20) NOT NULL -- name为非空...
  • 创建主键约束

    2012-08-01 22:41:37
    一、在Table中创建主键约束 创建主键约束可以在创建表或修改表时进行创建 一个表只能有一个Primary Key约束,不能在主键内的任何列中输入NULL值。 if object_id('house')is not null drop table house create ...
  • 2.定义主键约束 语法格式: CREATE TABLE [schema.] table( column datatype [DEFAULT expr] [colunm_constraint(完整性约束)], ... [table_constraint(完整性约束)]; ) eg: CREAT...
  • 约束类型按功能包括有:非空约束、主键约束、唯一约束、默认约束、外键约束、 【自动编号】AUTO_INCREMENT 起始值为1,增量为1。 自动编号的字段必须为数值型,若为浮点数小数位数必须为0。 自动编号必须和主键组合...
  • 1、主键约束 primary key 主键是每行的唯一标识符,仅仅通过它就能准确定位到一行,其中主键列在整个表中不能有重复,必须包含唯一的值(不能为NULL)。 alter table t_group  alter column id i...
  • 这里设置忽略关键字是不分大小写的。 EXCLUDE_RESERVED_WORDS 这个字段是忽略关键字的意思。 配置文件位置如下: 达梦安装路径下的 /data/实例名/dm.ini 达梦常见关键字有: domain,verify,reference,offset,limit,...
  • 主键约束、唯一性约束、检查约束

    万次阅读 2011-12-09 11:51:08
    1.约束定义了必须遵循的的用户维护数据一致性和正确性的规则,是强制实现数 据完整性的主要途径。... 主键约束(primary key)  唯一性约束(unique)  检查约束(check) 条件的构造  范围 字段 in(集合)
  • 约束的根本目的是保证数据的完整性,主要有主键约束、外键约束、唯一性约束、检查约束、默认值约束、非空约束。 域完整性 是对数据表中的字段属性进行约束,包括字段的值域、字段的类型以及字段的有效规则等约束,域...
  • 在ORACLE中,可以在创建主键约束的时候自动创建唯一索引,也可以先创建唯一索引,然后再基于这个唯一索引来创建主键约束。后一种方式有一个好处,在 需要对数据量比较大而且读写频繁的OLTP表创建主键约束的时候,...
  • 1、关于主键:在建表时指定primary key字句即可:create table test...如果是对于已经建好的表,想增加主键约束,则类似语法:alter table test add constraint pk_id primary key(id); 其中add constraint 和 pri...
  • 3. 主键约束 自动增长 4. 外键约束 级联操作 首先我们来想象一下,前几篇文章在我们操作数据库的过程中,自由度是很高的,想给哪个赋值就给哪个赋值,但是这样子,就会造成我们所创建的数据库数据不完整,例如我创建...
  • Oracle-11-主键约束

    千次阅读 2016-04-14 17:10:55
    一、Oracle系统一共提供了以下5种约束 ...3.主键(PARIMARY KEY)约束:唯一标识表中的一行; 4.外键(FOREIGN KEY)约束:用来维护子表(Child Table)和父表(Parent Table)之间的引用完成行; 5.条件(CHEC

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,169
精华内容 17,667
关键字:

设置主键约束的关键字