zoukankan      html  css  js  c++  java
  • MySQL 约束

    MySQL的四种约束:

    ※  主键约束 :primary key

    ※  唯一性约束:unique

    ※  外键约束:foreign key

    ※  非空约束:not null

    ※  默认值约束:default

    1. 添加主键约束 PRIMARY KEY

    1. 直接在字段后添加:PRIMARY KEY

    <字段名> <数据类型> PRIMARY KEY [默认值]
    
    # e.g.
    mysql> create table test (id int(5) primary key, name varchar(10));
    
    mysql> desc test ;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(5)      | NO   | PRI | NULL    |       |
    | name  | varchar(10) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+

    2. 建完所有字段后单独指定:

    mysql> create table test2
        -> (
        -> id int(5),
        -> name char(10),
        -> primary key(id)
        -> );
    Query OK, 0 rows affected, 1 warning (0.02 sec)
    
    mysql> desc test2;
    +-------+----------+------+-----+---------+-------+
    | Field | Type     | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+-------+
    | id    | int(5)   | NO   | PRI | NULL    |       |
    | name  | char(10) | YES  |     | NULL    |       |
    +-------+----------+------+-----+---------+-------+

    3. 添加复合主键

    将两个字段联合在一起,当成主键

    mysql> create table test3
        -> (
        -> id int(5),
        -> name char(10),
        -> primary key(id,name)
        -> );
    Query OK, 0 rows affected, 1 warning (0.02 sec)
    
    mysql> desc test3;
    +-------+----------+------+-----+---------+-------+
    | Field | Type     | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+-------+
    | id    | int(5)   | NO   | PRI | NULL    |       |
    | name  | char(10) | NO   | PRI | NULL    |       |
    +-------+----------+------+-----+---------+-------+

    4. 修改表的主键

    1. 表中原来没有主键约束

    mysql> alter table student
        -> add primary key(id);
    Query OK, 0 rows affected (0.05 sec)
    
    mysql> desc student;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(5)      | NO   | PRI | NULL    |       |
    | name  | varchar(10) | YES  |     | NULL    |       |
    | class | varchar(5)  | YES  |     | NULL    |       |
    | age   | int(3)      | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+

     2. 原本表里有主键,需要先删除:

    mysql> alter table student drop primary key , add primary key(name);
    Query OK, 0 rows affected (0.04 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> desc student;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(5)      | NO   |     | NULL    |       |
    | name  | varchar(10) | NO   | PRI | NULL    |       |
    | class | varchar(5)  | YES  |     | NULL    |       |
    | age   | int(3)      | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+

     2. 添加唯一约束 UNIQUE

    1. 建表时在字段后面添加

    <字段名> <数据类型> UNIQUE

    e.g.

    mysql> create table test (id int(5) unique);

    2. 修改表的唯一约束

    ALTER TABLE <数据表名> ADD CONSTRAINT <唯一约束名> UNIQUE(<列名>);

    3. 删除表的唯一约束

    ALTER TABLE <表名> DROP INDEX <唯一约束名>;

     3. 检查约束:CHECK

    检查约束(CHECK)可以通过 CREATE TABLE 或 ALTER TABLE 语句实现

    CHECK <表达式>

    1. 建表时创建

    # 创建工资表,添加约束 工资>0,并且<30000
    mysql> create table salarys
    -> ( -> id int(6) primary key, -> salary float, -> name varchar(10), -> check(salary>0 and salary<30000) -> ); Query OK, 0 rows affected, 1 warning (0.03 sec) mysql> desc salarys; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id | int(6) | NO | PRI | NULL | | | salary | float | YES | | NULL | | | name | varchar(10) | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql> show create table salarys; +---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | salarys | CREATE TABLE `salarys` ( `id` int(6) NOT NULL, `salary` float DEFAULT NULL, `name` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`), CONSTRAINT `salarys_chk_1` CHECK (((`salary` > 0) and (`salary` < 30000))) ) ENGINE=InnoDB DEFAULT CHARSET=gb2312 | +---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)

    2. 修改表的约束

    mysql> alter table salarys
        -> add constraint ck_name
        -> check(name<>'laowang')
        -> ;
    Query OK, 0 rows affected (0.05 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    mysql> show create table salarysG;
    *************************** 1. row ***************************
    Table: salarys
    Create Table: CREATE TABLE `salarys` (
    `id` int(6) NOT NULL,
    `salary` float DEFAULT NULL,
    `name` varchar(10) DEFAULT NULL,
    PRIMARY KEY (`id`),
    CONSTRAINT `ck_name` CHECK ((`name` <> _utf8mb3'laowang')),
    CONSTRAINT `salarys_chk_1` CHECK (((`salary` > 0) and (`salary` < 30000)))
    ) ENGINE=InnoDB DEFAULT CHARSET=gb2312

     

    3. 删除约束

    ALTER TABLE <数据表名> DROP CONSTRAINT <检查约束名>;

     4. 默认约束 DEFAULT

    <字段名> <数据类型> DEFAULT <默认值>;

    e.g.

    1. 创建一个默认字段为‘beijing’的表

    mysql> create table test4
        -> (
        -> location varchar(10) default 'beijing'
        -> );
    Query OK, 0 rows affected (0.03 sec)

    2. 修改表的默认约束

    ALTER TABLE <数据表名>
    CHANGE COLUMN <字段名> <数据类型> DEFAULT <默认值>;

    3. 删除表的默认约束

    ALTER TABLE <数据表名>
    CHANGE COLUMN <字段名> <字段名> <数据类型> DEFAULT NULL;

     5. 非空约束 NOT NULL

    1. 建表时创建:

    <字段名> <数据类型> NOT NULL;

    2. 修改表中约束:

    ALTER TABLE <数据表名>
    CHANGE COLUMN <字段名>
    <字段名> <数据类型> NOT NULL;

    3. 删除约束

    ALTER TABLE <数据表名>
    CHANGE COLUMN <字段名> <字段名> <数据类型> NULL;

    6. 外键约束:FOREIGN KEY

    [CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]
    REFERENCES <主表名> 主键列1 [,主键列2,…]

    1. 建表时创建约束:

    mysql> create table grade
        -> (
        -> gid int(10),
        -> record int(10),
        -> constraint fk_id
        -> foreign key(gid) references user(id)
        -> );
    Query OK, 0 rows affected, 2 warnings (0.04 sec)

    2. 给表添加外键约束:

    ALTER TABLE <数据表名> ADD CONSTRAINT <索引名>
    FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);

    3. 删除外键约束:

    ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
  • 相关阅读:
    BufferedImage学习记录一
    response总结一
    Externalizable接口
    request 总结一
    处理jsp显示文字过长问题
    验证码设计
    ORA01461: 仅能绑定要插入 LONG 列的 LONG 值
    MAP平台在单据中填写好部门后,关闭后重新打开,部门就没有了
    MAP平台设置节点选取范围
    MAP平台java.lang.StackOverflowError
  • 原文地址:https://www.cnblogs.com/wztshine/p/11950521.html
Copyright © 2011-2022 走看看