美文网首页
mysql 常见约束

mysql 常见约束

作者: 暴躁程序员 | 来源:发表于2023-03-07 17:42 被阅读0次

    一、主键约束 primary key

    1. 一个表中只能有一个主键,可将一字段或者多个字段设置成联合主键
    2. 主键值不能重复,不能为null空值
    
    1. 建表时定义主键约束
      每个表只能定义一个主键
    CREATE TABLE `user`(
        id INT PRIMARY KEY, -- PRIMARY KEY 主键约束
        username VARCHAR(22),
        `password` VARCHAR(22)
    )
    
    1. 修改表时添加和删除主键约束
    -- 添加主键约束
    ALTER TABLE `user` ADD PRIMARY KEY (id);
    -- 添加联合主键约束
    ALTER TABLE 表名 ADD PRIMARY KEY (字段1,字段2);
    
    -- 删除主键约束
    ALTER TABLE `user` DROP PRIMARY KEY;
    
    1. 主键自增长 auto_increment
    -- 默认从1开始,每插入一条数据 +1
    CREATE TABLE `user`(
        id INT PRIMARY KEY AUTO_INCREMENT, 
        username VARCHAR(22),
        `password` VARCHAR(22)
    )
    
    -- 设置自增的初始值,从100开始
    CREATE TABLE `user`(
        id INT PRIMARY KEY AUTO_INCREMENT,
        username VARCHAR(22),
        `password` VARCHAR(22)
    )
    INSERT INTO `user` (id,username,`password`) VALUES (99,'azbycx','qe213dsd376'); -- 先初始插入一个id为99的列,再正式插入数据
    INSERT INTO `user` (username,`password`) VALUES ('alias1','123456'); -- 100
    INSERT INTO `user` (username,`password`) VALUES ('alias2','123456'); -- 101
    

    二、外键约束 foreign key

    1. 外键约束将两个或多个表表关联起来,一个表中可以有多个外键
    2. 外键所在的表为从表,外键关联的主键所在的表为主表,从表的外键只能是主表的主键,不可以是其他值
    3. 一般通过主表查询和删除从表,删除主表前,必须先删除从表(删除用户前,必须把用户相关的信息都删掉)
    创建从表前必须先创建主表
    4. 创建外键时不设置外键名,会自动添加默认的外键名 pk_主表名
    
    1. 建表时定义外键约束
      用户详情表的uid作为外键,关联user表的主键id
    -- 主表
    CREATE TABLE `user`(
        id INT PRIMARY KEY AUTO_INCREMENT,
        username VARCHAR(22),
        `password` VARCHAR(22)
    )
    
    -- 从表,添加外键约束:CONSTRAINT 外键名 FOREIGN KEY(外键字段名) REFERENCES 主表名(主表主键)
    CREATE TABLE user_info(
        id INT PRIMARY KEY AUTO_INCREMENT,
        age SMALLINT,
        height SMALLINT,
        uid INT,
        CONSTRAINT fk_user FOREIGN KEY(uid) REFERENCES user(id)  -- FOREIGN KEY 外键约束
    )
    
    1. 修改表时添加和删除外键约束
    -- 添加外键约束:ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY(外键字段名) REFERENCES 主表名(主表主键);
    ALTER TABLE user_info ADD CONSTRAINT fk_user FOREIGN KEY(uid) REFERENCES user(id);
    
    -- 删除外键约束:ALTER TABLE 从表名 DROP FOREIGN KEY 外键名;
    ALTER TABLE user_info DROP FOREIGN KEY fk_user;
    

    三、唯一约束 unique

    字段值不能重复,只能有一个值为null空值

    1. 建表时定义唯一约束
    CREATE TABLE `user`(
        id INT,
        username VARCHAR(22) UNIQUE, -- UNIQUE 唯一约束
        `password` VARCHAR(22)
    )
    
    1. 修改表时添加和删除唯一约束
    -- 添加唯一约束:ALTER TABLE 表名 ADD CONSTRAINT 唯一约束名 UNIQUE(字段名);
    ALTER TABLE `user` ADD CONSTRAINT un_username UNIQUE(username);
    
    -- 删除唯一约束:ALTER TABLE 表名 DROP INDEX 唯一约束名;
    ALTER TABLE `user` DROP INDEX un_username;
    

    四、非空约束 not null

    字段的值不能为空

    1. 建表时定义非空约束
    CREATE TABLE `user`(
        id INT,
        username VARCHAR(22) NOT NULL, -- NOT NULL 非空约束
        `password` VARCHAR(22) NOT NULL -- NOT NULL 非空约束
    )
    
    1. 修改表时添加和删除非空约束
    -- 添加非空约束:ALTER TABLE 表名 CHANGE COLUMN 字段名 字段名 数据类型 NOT NULL;
    ALTER TABLE `user` CHANGE COLUMN username username int NOT NULL;
    
    -- 删除非空约束:ALTER TABLE 表名 CHANGE COLUMN 字段名 字段名 数据类型 NULL;
    ALTER TABLE `user` CHANGE COLUMN username username int NULL;
    

    五、默认值约束 default

    插入数据时,如果没有给默认值字段插入值,那么这个字段自动写入默认值

    1. 建表时定义默认值约束
    -- 不插入password时,默认 '123456'
    CREATE TABLE `user`(
        id INT,
        username VARCHAR(22),
        `password` VARCHAR(22) DEFAULT '123456' -- DEFAULT 默认值约束
    )
    
    -- 插入数据测试
    INSERT INTO `user`(id,username) VALUES (1,'alias1');
    INSERT INTO `user`(id,username) VALUES (2,'alias2');
    
    1. 修改表时添加和删除默认值约束
    -- 添加默认值约束:ALTER TABLE 表名 CHANGE COLUMN 字段名 字段名 数据类型 DEFAULT 默认值;
    ALTER TABLE `user` CHANGE COLUMN `password` `password` VARCHAR(22) DEFAULT '123456';
    
    
    -- 删除默认值约束:ALTER TABLE 表名 CHANGE COLUMN 字段名 字段名 数据类型 DEFAULT NULL;
    ALTER TABLE `user` CHANGE COLUMN `password` `password` VARCHAR(22) DEFAULT NULL;
    

    六、检查约束 check

    插入和修改数据时,对数据的值进行约束,可使用查询子句

    1. 建表时定义检查约束
    -- age的范围大于0,小于150
    CREATE TABLE user_info(
        id INT,
        age SMALLINT,
        CHECK(age > 0 AND age<150)
    )
    
    -- 插入数据测试
    INSERT INTO user_info (id,age) VALUES (1,0);
    INSERT INTO user_info (id,age) VALUES (2,100);
    INSERT INTO user_info (id,age) VALUES (3,170);
    
    1. 修改表时添加和删除检查约束
    -- 添加检查约束:ALTER TABLE 表名 ADD CONSTRAINT 检查约束名 CHECK检查约束表达式;
    ALTER TABLE user_info ADD CONSTRAINT check_age CHECK(age > 0 AND age<250);
    
    -- 删除检查约束:ALTER TABLE 表名 DROP CONSTRAINT  检查约束名;
    ALTER TABLE user_info DROP CONSTRAINT check_age;
    

    查看表约束

    -- 方式一:查看表结构和表约束
    DESC 表名;
    
    -- 方式二:可查看表的所有约束信息
    SHOW CREATE TABLE user_info;
    -- Create Table 值如下:
    -- CREATE TABLE `user_info` (
    --   `id` int(11) DEFAULT NULL,
    --   `age` smallint(6) DEFAULT NULL,
    --   CONSTRAINT `check_age` CHECK (`age` > 0 and `age` < 250)
    -- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
    
    -- 方式三:可查看表的约束名和约束类型
    SELECT 
    CONSTRAINT_CATALOG, -- 约束方案
    CONSTRAINT_SCHEMA, -- 库名
    CONSTRAINT_NAME, -- 约束名
    TABLE_SCHEMA, -- 库名
    TABLE_NAME,  -- 表名
    CONSTRAINT_TYPE -- 约束类型
    FROM
    information_schema.TABLE_CONSTRAINTS
    WHERE
    CONSTRAINT_SCHEMA = '库名' AND TABLE_NAME='表名'
    

    相关文章

      网友评论

          本文标题:mysql 常见约束

          本文链接:https://www.haomeiwen.com/subject/xuibldtx.html