MySQL基础|完整性约束条件

主键

  • 习惯上 使用无实际意义的字段作为主键

use db_imist;

-- 测试主键;

CREATE TABLE test_prinary_key(
  id INT UNSIGNED PRIMARY KEY, -- 设置为主键不允许许为null
  username VARCHAR(20)
);

desc test_prinary_key;

INSERT test_prinary_key(id,username) VALUES(1,'imist'); -- 如果不设置主键会报错的

INSERT test_prinary_key(username) VALUES('tom'); -- 如果不设置主键会报错的 `Field 'id' doesn't have a default value`

INSERT test_prinary_key(id,username) VALUES(1,'tom'); -- 如果主键重复会报错的 'Duplicate entry '1' for key 'PRIMARY''

-- 在下方指定主键也是可以的,这种情况适合于复合主键
-- 一张表中多主键是不被允许的,复合主键的使用两个或者多个字段共同定义主键,当两条记录同时相同,才代表同一条记录

CREATE TABLE test_prinary_key2(
  id INT UNSIGNED  PRIMARY KEY, -- 设置为主键不允许许为null
  courceId INT UNSIGNED  PRIMARY KEY,
  username VARCHAR(20)
); -- 多主键不被允许

-- DROP TABLE  test_prinary_key3;

-- 复合主键
CREATE TABLE test_prinary_key3(
  id INT UNSIGNED,
  courceId VARCHAR(20),
  username VARCHAR(20),
  email VARCHAR(50),
  PRIMARY KEY (id,courceId)
);
-- primary key 1-a ,两个字段构成唯一值即可,且单独一字段可以重复,两个字段联合快速定位一条数据
INSERT test_prinary_key3(id, courceId, username, email)  VALUES(1,'a','imist','az460024285@qq.com') ;
-- primary key 1-b
INSERT test_prinary_key3(id, courceId, username, email)  VALUES(1,'b','imist','az460024285@qq.com') ;
-- primary key 2-a
INSERT test_prinary_key3(id, courceId, username, email)  VALUES(2,'a','imist','az460024285@qq.com') ;
-- 复合主键重复 ,数据无法插入 primary key1-a `Duplicate entry '1-a' for key 'PRIMARY'`
INSERT test_prinary_key3(id, courceId, username, email)  VALUES(1,'a','imist','az460024285@qq.com') ;

select * FROM test_prinary_key3;


-- 测试 auto_increment 自动增长,从1开始 ,一般配合主键索引使用
-- 不使用主键单独使用自增长 `Incorrect table definition; there can be only one auto column and it must be defined as a key`
CREATE TABLE test_auto_increment(
  id INT UNSIGNED AUTO_INCREMENT,
  username VARCHAR(20)
);

CREATE TABLE test_auto_increment(
  id INT UNSIGNED KEY AUTO_INCREMENT,-- 类型为int的无符号数值 ,并且是自增长的主键
  username VARCHAR(20)
);
DESC test_auto_increment;

INSERT test_auto_increment(username) VALUES ('iMist');
INSERT test_auto_increment(username) VALUES ('Tom');
INSERT test_auto_increment(username) VALUES ('Qiang');
INSERT test_auto_increment(username) VALUES ('Gang');
-- 这种自增长的情况下,没有指定id的话 就是自增长的,已有编号的最大值+1
SHOW CREATE TABLE test_auto_increment;
INSERT test_auto_increment(id,username) VALUES (100,'小雾');
INSERT test_auto_increment(username) VALUES ('小赖');
-- 若是指定了id ,就从已有id的最大值开始,可以跳跃,但是不可以重复
INSERT test_auto_increment(id,username) VALUES (NULL ,'小人'); -- Null的情况下可以实现自增长
INSERT test_auto_increment(id,username) VALUES (DEFAULT ,'小可'); -- Default也可以自增长
INSERT test_auto_increment(id,username) VALUES ('' ,'小可'); -- 在idea的数据库工具,也可以自增长,MySql命令行没有试过

SHOW CREATE TABLE test_auto_increment;

SELECT * FROM test_auto_increment;

-- 测试NOT NULL
CREATE TABLE test_not_null(
  a VARCHAR(20),
  b VARCHAR(20) NOT NULL

);
desc test_not_null;
Show CREATE TABLE test_not_null;

INSERT test_not_null(a,b) VALUES ('',''); -- 这种情况可以被允许,因为不为null,而是空字符串;
INSERT test_not_null(a,b) VALUES (null ,null ); -- b字段不可以为null `Column 'b' cannot be null`
INSERT test_not_null(a,b) VALUES (null ,'' ); -- 成功插入一条数据
INSERT test_not_null(a,b) VALUES (null ,'abc' ); -- 成功插入一条数据
INSERT test_not_null(a) VALUES ('abc'); -- `Field 'b' doesn't have a default value`

SELECT * FROM test_not_null;

-- 测试默认值
-- DEFAULT一般和NOT NULL 配合使用,若是字段不可以为空那么可以给一个DEFAULT ,若是字段可以为null 那么就默认为null了

CREATE TABLE test_default(
  id INT UNSIGNED AUTO_INCREMENT KEY ,
  username VARCHAR(20) NOT NULL ,
  age TINYINT UNSIGNED DEFAULT 18,
  email VARCHAR(50) NOT NULL DEFAULT '462541258@qq.com'
);
DESC test_default;

INSERT test_default (username) VALUES('iMist'); -- 主键自增长 age 和email采用了默认值
INSERT test_default (username, age, email) VALUES ('Tom',20,'4600202585@qq.com'); -- 插入一条记录为username age ,email赋值
INSERT test_default (username, age, email) VALUES ('jony',null ,'4600202585@qq.com');-- 插入一条记录为username ,email赋值 age设置null
INSERT test_default (username, age, email) VALUES ('jony',20 ,null );-- 虽然有默认值 ,但是对设置了NOT NULL的字段设置为null就会报错的  `Column 'email' cannot be null`
INSERT test_default (username, age, email) VALUES ('jony',20 ,DEFAULT ); -- 若是该字段设置了默认值,就使用默认值为该字段赋值
INSERT test_default (username, age, email) VALUES ('jony',20 ,'' ); -- 有默认值的情况下赋值''字符 插入''字符串
INSERT test_default (username, age, email) VALUES (DEFAULT ,20 ,'4600202585@qq.com' );
-- 若是该字段没有设置默认值的情况下使用了Default那么就会报错 `Field 'username' doesn't have a default value`

SELECT * FROM test_default;

-- 测试枚举类型的默认值
CREATE TABLE test_default1(
  id INT UNSIGNED AUTO_INCREMENT KEY ,
  sex ENUM('a','b','c') NOT NULL DEFAULT 'a'
  -- sex ENUM('a','b','c') NOT NULL DEFAULT 'd' 此条语句不合法,因为枚举类型的默认值必须在枚举数据集中
);
desc test_default1;

INSERT test_default1(sex) VALUES (null ); -- 不可以为null ` Column 'sex' cannot be null`
INSERT test_default1(sex) VALUES (''); -- 数据不合法,因为默认值不在枚举类型定义的数据集之内`Data truncated for column 'sex' at row 1`
INSERT test_default1(sex) VALUES (DEFAULT ); -- 插入一条记录,sex字段为默认值
INSERT test_default1(id) VALUES (3); -- 插入一条记录,sex字段没有设置,采用默认值

SELECT * FROM  test_default1;


-- UNIQUE KEY 唯一性索引,可以有多个, 和主键类似,值不能重复,但是可以有多个Null值


唯一约束

   -- 测试UNIQUE KEY 唯一约束
   use db_imist;
   CREATE TABLE test_unique(
     id INT UNSIGNED AUTO_INCREMENT KEY ,
     username VARCHAR(20) NOT NULL UNIQUE KEY ,
     email VARCHAR(50) UNIQUE ,
     card CHAR(18) UNIQUE -- 注意写法KEY这里可以省略
   );
   
   INSERT test_unique (username, email, card) VALUES ('A','A@qq.com','1');
   
   INSERT test_unique (username, email, card) VALUES ('A','462258485@qq.com','2');-- 这里报错 `Duplicate entry 'A' for key 'username'`
   
   INSERT test_unique (username, email, card) VALUES ('B',NULL ,NULL );-- 这里可以插入
   
   INSERT test_unique (username, email, card) VALUES ('C',NULL ,NULL );-- 这里可以插入 Null在这里可以重复
   
   SELECT * FROM test_unique;
   
   -- 重新创建用户表 ,放在反引号``之间更加规范,防止和关键字起冲突
   -- 用COMMENT '用户编号' 来给字段添加注释
   DROP TABLE IF EXISTS table_user  ;
   CREATE TABLE IF NOT EXISTS `table_user`(
     `id` INT UNSIGNED AUTO_INCREMENT KEY COMMENT '用户编号',
     `username` VARCHAR(20) NOT NULL UNIQUE COMMENT '用户名',
     `password` CHAR(32) NOT NULL COMMENT '密码',
     `email` VARCHAR(50) NOT NULL COMMENT '邮箱',
     `age` TINYINT UNSIGNED NOT NULL  DEFAULT  18 COMMENT '年龄',
     `sex` ENUM('男','女','保密') NOT NULL DEFAULT '保密' COMMENT '性别',
     `tel` CHAR(11) NOT NULL UNIQUE COMMENT '电话',
     `addr` VARCHAR(50) NOT NULL DEFAULT '北京' COMMENT '地址',
     `card` CHAR(18) NOT NULL UNIQUE COMMENT '身份证号',
     `marry` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '0 代表未结婚,1代表已结婚',
     `salary` FLOAT(8,2) NOT NULL DEFAULT 0 COMMENT '薪水'
   )ENGINE = INNODB DEFAULT CHARSET = UTF8;
   
   DESC `table_user`;
   
   SHOW CREATE TABLE `table_user`;

总结:

  • 唯一约束的KET关键字可以省略,NULL值是可以重复的
  • 数据库名 ,表名,字段名 等用户自定义名称用``包裹,可以防止关键词冲突
  • COMMENT ‘字段备注或者注释’
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值